Si ma classe implements
possède une interface, puis-je dire que je suis l'héritage? Je sais que quand une classe une extends
autre classe, c'est l'héritage.
Si ma classe implements
possède une interface, puis-je dire que je suis l'héritage? Je sais que quand une classe une extends
autre classe, c'est l'héritage.
Réponses:
MISE À JOUR: J'ai révisé cette réponse. Un certain nombre de bons points ont été soulevés dans les commentaires qui méritaient d'être cités.
Si ma classe implémente une interface, puis-je dire que je suis l'héritage?
Il n'est pas tout à fait clair ce que vous entendez par "héritage suivant". Posons une question légèrement différente?
Qu'est-ce que l'héritage?
Ce sont subtilement différents. C'est malheureux car c'est déroutant.
Quelles confusions naissent généralement de cette distinction subtile?
La confusion peut survenir parce que les gens considèrent l'héritage comme un mécanisme de partage des détails de mise en œuvre. Bien qu'il est un tel mécanisme, ce mécanisme fonctionne en partageant les membres . Ces membres n'ont pas besoin d'implémentations! Comme nous le verrons, ils peuvent être abstraits.
Personnellement, je serais plus heureux si les spécifications Java et C # utilisaient un mot autre que "hérite" pour décrire la relation entre les méthodes d'interface et les classes, pour éviter cette confusion. Mais ils ne le font pas, et nous devons raisonner à partir des spécifications, pas contre eux.
En Java, les membres de l'interface sont-ils hérités par les classes qui les implémentent?
Oui, certains le sont. Voir la section 8.4.8 des spécifications Java, que je cite ici pour votre commodité.
Une classe C hérite de sa superclasse directe et de ses superinterfaces directes toutes les méthodes abstraites et par défaut m pour lesquelles toutes les conditions suivantes sont vraies: [...]
Si vous dites qu'une classe implémente une interface, la classe hérite des méthodes abstraites et par défaut de cette interface . (Bien sûr, j'ai omis les conditions qui suivent; voir la spécification pour plus de détails. En particulier, une classe qui implémente un membre d'une interface n'est pas considérée comme ayant hérité de ce membre. Encore une fois, est-ce déroutant? Oui.)
Disons-nous généralement en Java qu'une classe hérite d'une interface?
Typiquement, nous dirions qu'une classe implémente une interface. Comme indiqué ci-dessus, une classe peut hériter des membres d'une interface et pourtant ne pas être considérée comme héritant de l'interface. Ce qui prête à confusion, oui.
Cette distinction subtile est-elle importante dans le travail quotidien?
Généralement non. Ce type d'analyse étroite de la spécification est plus utile pour les rédacteurs de compilateurs que pour les développeurs métier. Il est plus important de comprendre quand utiliser une interface que d'obtenir une définition précise de "hérite de".
java
, c'est donc la bonne réponse, à moins que l'OP ne signifiait autre java
chose :-)
L'héritage signifie l'écriture d'une nouvelle sous-classe pour une superclasse. Écrire une nouvelle classe sur une interface implémente cette interface. (Et l'écriture d'une nouvelle interface basée sur une ancienne étend cette interface.)
Le seul terme correct qui s'applique aux trois possibilités est le sous - typage . Tous les sous-types ne sont pas une sous-classe.
Avec les sous - classes , vous
Avec les interfaces , vous remplissez un contrat en implémentant les méthodes déclarées.
C'est la façon classique de voir les choses. Maintenant, avec Java 8, les interfaces deviennent un mélange:
Est-ce que l'implémentation d'une interface dont toutes les méthodes ont des implémentations par défaut compterait toujours comme «implémenter», ou plutôt comme extension? Je ne pouvais pas le dire. Comme ce cas est assez farfelu (cela a en fait activé le multi-héritage sans état), j'utiliserais toujours «l'héritage» uniquement avec des sous-classes.