web-dev-qa-db-fra.com

Si j'implémente une interface, est-elle appelée héritage?

Si ma classe implements une interface, puis-je dire que je suis l'héritage? Je sais que quand une classe extends une autre classe alors c'est l'héritage.

33
RajeeV VenkaT

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?

  • Lorsque les membres d'un type X sont considérés comme membres d'un autre type Y, ces membres de Y sont hérités de X .
  • Il existe une relation d'héritage entre certains types; c'est-à-dire que pour certains types X et Y, nous disons "Y hérite de X".

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 soit un tel mécanisme, ce mécanisme fonctionne en partageant 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 ce n'est pas le cas, et nous doivent raisonner à partir de les spécifications, pas contre elles.

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 de spécification Java Java 8.4.8, 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, alors 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 pas considérée d'avoir 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 est déroutant, 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".

78
Eric Lippert

Héritage signifie écrire une nouvelle sous-classe pour une superclasse. Écrire une nouvelle classe sur une interface, c'est implémenter cette interface. (Et écrire une nouvelle interface basée sur une ancienne est extension cette interface.)

Le seul terme correct qui s'applique aux trois possibilités est sous-typage. Tous les sous-types ne sont pas une sous-classe.

26
Kilian Foth

Avec sous-classes, vous

  • hérite de l'état de la superclasse (toutes les variables d'instance, que vous les voyiez ou non)
  • hérite des implémentations réelles (toutes les méthodes non abstraites)

Avec 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:

  • vous n'héritez toujours pas de l'état (car les interfaces n'ont toujours pas de variables d'instance)
  • vous pouvez maintenant hériter des implémentations par défaut de l'interface

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), je n'utiliserais toujours "l'héritage" qu'avec des sous-classes.

1
Peter Walser