187 votes

Pourquoi il n’y a aucun héritage multiple en Java, mais implémente plusieurs interfaces est autorisé

Java n'autorise pas l'héritage multiple mais permet d'implémenter plusieurs interfaces. Pourquoi?

265voto

Bozho Points 273663

Parce que les interfaces spécifient uniquement ce que fait la classe, pas comment elle le fait.

Le problème avec l'héritage multiple est que deux classes peuvent définir différentes façons de faire la même chose, et la sous-classe ne peut pas choisir laquelle choisir.

115voto

Syntactic Points 4068

L'un de mes instructeurs du collège il m'a expliqué de cette façon:

Supposons que j'ai une classe, qui est un grille-pain, et une autre classe, qui est NuclearBomb. Ils ont une "obscurité". Ils ont tous les deux une sur (). (On a une off " (éteint), l'autre n'a pas.) Si je veux créer une classe qui est une sous-classe de ces deux...comme vous pouvez le voir, c'est un problème qui pourrait vraiment m'exploser au visage ici.

Ainsi, l'un des principaux problèmes est que si vous avez deux classes parent, ils pourraient avoir des implémentations différentes de la même fonction - ou peut-être deux fonctions différentes avec le même nom, comme dans mon instructeur exemple. Ensuite, vous avez à traiter avec à décider lequel votre sous-classe va utiliser. Il y a des moyens de manutention, certes - C++ -, mais les concepteurs de Java estime que cela permettrait de rendre les choses trop compliquées.

Avec une interface, cependant, vous êtes en décrivant quelque chose de la classe est capable de faire, plutôt que d'emprunter une autre classe de la méthode de faire quelque chose. Plusieurs interfaces sont beaucoup moins susceptibles de causer un délicat les conflits doivent être résolus de plusieurs classes parentes.

24voto

Michael Borgwardt Points 181658

Parce que l'héritage est utilisé de manière excessive, même si vous ne pouvez pas dire "hé, cette méthode semble utile, je vais également étendre cette classe".

 public class MyGodClass extends AppDomainObject, HttpServlet, MouseAdapter, 
             AbstractTableModel, AbstractListModel, AbstractList, AbstractMap, ...
 

6voto

Tadeusz Kopec Points 7625

La mise en œuvre de plusieurs interfaces est très utile et ne cause pas de problèmes de langue maîtres d'œuvre, ni les programmeurs. Donc c'est autorisé. L'héritage Multiple, tout aussi utile, peut causer de graves problèmes pour les utilisateurs (redouté de diamant de la mort). Et la plupart des choses que vous faites avec l'héritage multiple peut être également effectué par la composition ou à l'aide de classes internes. Donc, l'héritage multiple est interdit d'apporter plus de problèmes que de gains.

3voto

Justin Niessner Points 144953

Pour la même raison, C# ne permet pas l'héritage multiple, mais vous permet d'implémenter plusieurs interfaces.

La leçon de C++ w/ l'héritage multiple est qu'il entraîner plus de problèmes qu'elle n'en valait la peine.

Une interface est un contrat de choses que votre classe a à mettre en œuvre. Vous n'avez pas gain de toutes les fonctionnalités de l'interface. L'héritage permet d'hériter de la fonctionnalité d'un parent de la classe (et dans de multiples-l'héritage, qui peut être extrêmement déroutant).

Permettant de multiples interfaces vous permet d'utiliser des Modèles de Conception (comme Adaptateur) pour résoudre le même type de problèmes que vous pouvez résoudre en utilisant l'héritage multiple, mais en beaucoup plus fiable et prévisible.

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