131 votes

Pourquoi une classe abstraite qui implémente une interface peut manquer la déclaration/mise en œuvre de l’un de l’interface ' méthodes de s ?

Une chose curieuse se produit en Java lorsque vous utilisez une classe abstraite pour implémenter une interface : certaines des méthodes de l’interface peut être complètement absent (c'est-à-dire ni une déclaration abstraite ou une implémentation réelle est présente), mais le compilateur ne se plaint pas.

Par exemple, compte tenu de l’interface :

la classe abstraite suivante obtient gaiement compilée sans un avertissement ou une erreur :

Pouvez-vous nous expliquer pourquoi ?

165voto

Bill the Lizard Points 147311

C’est parce que si une classe est abstraite, puis par définition vous sont nécessaires pour créer des sous-classes de celui-ci à instancier. Les sous-classes devront mettre en oeuvre des méthodes de l’interface que la classe abstraite laissée de côté (par le compilateur).

Suivant votre exemple de code, essayez de faire une sous-classe de sans la mise en œuvre de la méthode et voir quelles sont les erreurs du compilateur vous donne. Il va vous forcer à mettre en œuvre de cette méthode.

34voto

Gishu Points 59012

Parfaitement bien.
Vous ne pouvez pas instancier les classes abstraites.. mais les classes abstraites peuvent être utilisés à la maison commune des implémentations pour les m1() et m3().
Donc, si m2() de la mise en œuvre est différente pour chaque exécution, mais en m1 et m3 ne sont pas. Vous pouvez créer différents béton IAnything implémentations avec juste les différentes m2 mise en œuvre et en tirer AbstractThing -- honorer le principe DRY. La validation si l'interface est complètement mis en œuvre pour une classe abstraite est futile..

Mise à jour: Intéressant, je trouve que C# applique cela comme une erreur de compilation. Vous êtes obligé de copier les signatures de méthode et de les préfixer avec "abstrait public" dans la classe de base abstraite dans ce scénario.. (quelque chose de nouveau tous les jours:)

4voto

Mustakimur Rahman Points 293

L'Interface désigne une classe qui n'a pas de mise en œuvre de la méthode, mais avec juste de la déclaration.
D'autre part, une classe abstraite est une classe qui peut avoir la mise en œuvre d'une méthode avec un peu de méthode, avec juste de la déclaration, la mise en œuvre.
Lorsque nous mettons en œuvre une interface d'une classe abstraite, sa signifie que la classe abstraite hérité de toutes les méthodes de l'interface. Comme, il n'est pas important de mettre en œuvre toutes les méthodes dans la classe abstraite mais elle revient à la classe abstraite (par héritage), de sorte que la classe abstraite peut à gauche une partie de la méthode dans l'interface sans mise en œuvre ici. Mais, lorsque cette classe abstraite sera héritée par certains de la classe de béton, ils doivent avoir à implémente tous ceux appliqués méthode dans la classe abstraite.

1voto

Vincent Ramdhanie Points 46265

Les classes abstraites ne sont pas tenus d’implémenter les méthodes. Donc même si elle implémente une interface, les méthodes abstraites de l’interface peuvent rester abstraites. Si vous tentez d’implémenter une interface dans une classe concrète (c.-à-d. pas abstraites) et vous n’implémentez pas les méthodes abstraites, le compilateur vous dira : soit mettre en œuvre les méthodes abstraites ou déclarez la classe comme abstraite.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X