8
votes

Pourquoi Java autorise-t-il plusieurs héritages d'interfaces mais pas de classes abstraites / béton

Dupliqué possible:
Pourquoi il n'y a pas de héritage multiple en Java , mais la mise en œuvre de plusieurs interfaces est autorisée

Pourquoi Java permet de multiples héritage d'interfaces mais pas de classes abstraites ou concrètes


1 commentaires

Dupliquer de Stackoverflow.com/Questtions/2515477/...


4 Réponses :


13
votes

L'héritage multiple des classes en béton augmente une variété de problèmes .

Par exemple, si une classe hérite de deux implémentations différentes de la même méthode de deux classes de base différentes?

Pour éviter ces problèmes, Java ne prend pas en charge cette fonctionnalité.
Contrairement aux classes en béton, les interfaces ne peuvent pas avoir de corps de méthode.

Par conséquent, aucune de ces problèmes ne s'applique aux interfaces.


2 commentaires

Voulez-vous ajouter que ces problèmes peuvent être résolus (comme dans de nombreuses autres langues), c'est juste qu'il n'y a pas beaucoup de point à faire cela.


Je vais vous dire pourquoi quelqu'un peut avoir voté cela. BCZ Cela ne répond toujours pas à la question pourquoi? Vous voyez que je peux avoir 2 interfaces distinctes avec la même méthode nommée. Mais quand je vais mettre en œuvre à la fois dans une classe ... L'EDI vous demandera de vous excréter et de faire votre propre à cause de la confrontation. Maintenant, pourquoi la Java ne demande pas de remplacer et d'écrire votre propre si 2 classes que je prolonge avec la même méthode ???



1
votes

Je n'aime vraiment pas le terme "hériter" ici, cela conduit à beaucoup de confusion.

Java permet uniquement aux interfaces d'étendre d'autres interfaces et des classes à implémenter des interfaces.

Si vous regardez une interface comme un ensemble mathématique de déclarations, chaque «s'étend» ne fournit que l'Union de l'ensemble du superinterface et celle de l'interface actuelle. Vous êtes donc autorisé à faire plusieurs "syndicats".

Lorsque vous arrivez à une classe qui implémente une ou plusieurs interfaces, la sémantique est simplement que la classe doit fournir des implémentations pour toutes les méthodes de l'ensemble. Une classe implémentant plusieurs interfaces pourrait être réécrite en tant que classe implémentant une seule interface qui étend toutes les interfaces ci-dessus.

Dans le cas des classes héritant plusieurs classes, il n'est pas permis car il conduit à divers problèmes, y compris le problème de diamant. Par exemple, si j'ai deux super-types avec différentes implémentations de la même signature de méthode, lequel devrait être utilisé dans le sous-type?


0 commentaires

0
votes

Pour rendre la langue plus simple et plus élégante. C ++ permet beaucoup de choses, mais cela souffre souvent d'apprendre et d'utiliser. Nous (moi, au moins :)) Je ne veux pas que Java soit comme ça.


0 commentaires

3
votes

Parce que la mise en œuvre d'une interface n'est pas l'héritage. Cela signifie simplement que votre classe adhérera à un contrat prédéfini, généralement pour fournir un ensemble de méthodes liées à une certaine fonctionnalité. Toute classe peut adhérer à de nombreux contrats de ce type sans conflit (à moins que deux de ces interfaces ne définissent la même méthode).

Contrairement à l'héritage, il ne reçoit pas automatiquement des attributs ou des fonctionnalités en raison d'une relation hiérarchique avec sa superclasse, car aucune relation de ce type n'existe.

Plusieurs héritages sont essentiellement autorisés dans Java ou de nombreuses autres langues OO en raison du problème de héritage de diamant déjà mentionné.


0 commentaires