2015-04-25 3 views
1

J'illustrera mon problème avec l'utilisation d'un exemple:classes anonymes et interfaces

La méthode addActionListener accepte une interface ActionListener comme seul argument. Donc, lorsque vous invoquez cette méthode sur un objet/composant (comme un bouton) pour enregistrer un écouteur sur l'objet, en utilisant une classe interne anonyme, pourquoi devons-nous également implémenter l'interface? classe? Est-ce parce que, par définition, les interfaces ne peuvent pas être instanciées, à moins bien sûr que vous ne créiez un objet de ce type Interface qui implémente les méthodes abstraites de cette Interface?

-à-dire

aButton.addActionListener(new ActionListener() { 
    public void actionPerformed(ActionEvent e) { 
     // do stuff 
    } 
}); 

C'est, grâce à l'utilisation des classes anonymes, nous pouvons éviter explicitement faire toute la classe implémentant l'interface (déclarée dans l'en-tête), mais nous instanciation d'un objet de l'interface (qui, par définition, ne devrait pas être possible) et l'implémentation des méthodes abstraites de l'interface dans la classe anonyme. Il est donc uniquement possible d'instancier un objet dans l'interface, car à ce moment-là, un contrat doit être rempli pour implémenter les méthodes de l'interface, ce qui nous permet de créer un objet à partir de L'interface? Par conséquent, est la raison pour laquelle nous ne pouvons implémenter la méthode actionPerformed() de l'interface que possible parce que nous avions instancié un objet de l'interface (ce qui nous oblige simultanément à remplir le contrat de mise en œuvre des méthodes abstraites)? Donc pourrait-on dire que nous sommes 'implicitement' implémentant une interface par l'instanciation in situ de l'interface (comme l'argument addActionListener)?

+3

Je pense que vous pensez trop. Vous définissez une classe concrète qui implémente l'interface et instancie un objet de cette classe concrète. Tout comme si vous aviez une classe nommée qui implémente l'interface, sauf sans donner un nom à la classe. J'ai peur de ne pas comprendre ce que vous demandez. – ajb

+1

Une interface peut être vue comme un contrat qui définit une fonction d'ensemble que toutes les classes d'implémentation sont censées fournir. 'addActionListener' dit:" J'ai besoin de quelque chose qui peut faire 'ActionListener' stuff " –

Répondre

3

Vous n'instanciez pas l'interface.

Vous définissez et instanciez une classe concrète réelle qui implémente l'interface. Vous devez implémenter toutes les méthodes déclarées dans l'interface, comme si vous aviez écrit une classe "normale" implémentant l'interface. La construction de classe anonyme vous évite d'avoir à nommer une classe qui ne sera utilisée que dans un endroit très spécifique de votre code. Mais si vous vouliez vous pourriez avoir décidé de le faire. Sous les couvertures c'est la même chose - vous avez défini une classe pour implémenter l'interface puis instancié cette classe.