JavaRush /Blog Java /Random-FR /Pause café #95. Comment résoudre le problème de l'héritag...

Pause café #95. Comment résoudre le problème de l'héritage multiple en Java

Publié dans le groupe Random-FR
Source : FreeCodeCamp Java est l'un des langages de programmation orientés objet les plus populaires utilisés aujourd'hui. Comme il est indépendant de la plate-forme, vous pouvez trouver des applications Java sur tous les types d'appareils et tous les systèmes d'exploitation. Et comme Java est relativement facile à apprendre, c’est l’un des langages que de nombreux programmeurs maîtrisent. Une fonctionnalité importante de Java que vous devez connaître est l’héritage de classe. L'héritage vous permet d'optimiser votre code, facilitant ainsi la réutilisation des classes. Lorsque vous pouvez réutiliser du code déjà testé et débogué, le cycle de vie du développement logiciel devient plus court et moins coûteux. Pause café #95.  Comment résoudre le problème de l'héritage multiple en Java - 1Bien qu’il s’agisse d’un concept simple en théorie, le codage des relations d’héritage nécessite une attention particulière aux détails. Surtout en ce qui concerne l'héritage multiple, où une classe enfant hérite des propriétés de plusieurs classes parents. Java rejette les relations d'héritage multiples car elles créent une ambiguïté, mais il existe plusieurs façons d'obtenir bon nombre des mêmes effets si vous savez quoi faire. Dans cet article, nous examinerons les problèmes liés à l'héritage multiple et discuterons des options de codage alternatives en Java.

Terminologie de l'héritage

Parfois, pour devenir un programmeur performant, vous devez devenir un résolveur de problèmes pour trouver des solutions de contournement aux erreurs ou problèmes courants. Il s’agit d’un élément essentiel d’un codage sécurisé et intelligent. L’un de ces problèmes est lié à l’héritage multiple (ou plutôt à son absence) en Java. Pause café #95.  Comment résoudre le problème de l'héritage multiple en Java - 2Pour bien comprendre l'héritage en Java, vous devez être familier avec la terminologie de base de l'héritage de la programmation orientée objet (POO).
  • Les classes constituent la structure de modèle fondamentale dans les langages de programmation orientés objet. Une classe définit des propriétés communes pour un groupe d'objets.
  • Classe parent : Également connue sous le nom de classes de base ou de super classes. Une classe parent est une classe extensible qui fournit des fonctionnalités à une classe enfant. Cela permet la réutilisation. Les définitions et fonctions de la classe parent sont réutilisées lors de la création des classes enfants.
  • Classe enfant : Plus génériquement appelée sous-classe, une classe enfant hérite des fonctionnalités d’une autre classe. Les classes enfants sont des classes étendues ou dérivées.
  • Héritage : La relation entre les classes parent et enfant.

Types d'héritage POO

Il existe aujourd'hui de nombreux langages de programmation orientés objet populaires, notamment Java, C++, JavaScript, Python, PHP, Ruby et Perl. Bien que l'héritage soit un concept courant parmi ces langages POO, tous les types d'héritage n'existent pas dans chacun de ces langages. Il est extrêmement important de connaître les types courants d'héritage et les restrictions en matière d'héritage dans la langue spécifique que vous utilisez. Plus vous en saurez sur l’héritage, plus vous deviendrez un développeur efficace. Les types d'héritage pris en charge par Java incluent :
  • Héritage à un seul niveau : lorsqu'une classe enfant hérite des fonctionnalités d'une classe parent unique.
  • Héritage multi-niveaux : Il s'agit d'une forme multi-niveaux d'héritage à un seul niveau. Dans l'héritage multiniveau, une classe enfant peut également agir comme classe parent pour d'autres classes enfants. La relation entre chaque niveau est linéaire : aucune branche ne va plus haut qu’avec l’héritage multiple. Dans ce cas, la classe enfant finale a des fonctions de tous les niveaux supérieurs.
  • Héritage hiérarchique : L'opposé de l'héritage multiple. Dans l’héritage hiérarchique, une classe parent unique a plusieurs classes enfants. Ainsi, au lieu d’avoir des branches au-dessus, elle se ramifie en dessous.
  • Héritage hybride : Comme son nom l'indique, l'héritage hybride est une combinaison d'autres types d'héritage.
Outre les types d'héritage répertoriés ci-dessus, il existe d'autres types que Java ne prend pas en charge.
  • Héritage multiple : Dans l'héritage multiple, une classe enfant a plus d'une classe parent. Bien que Java et JavaScript ne prennent pas en charge l'héritage multiple, les langages POO tels que C++ le font.
  • Héritage multi-chemin : Hybride d'héritage multiple, multi-niveaux et hiérarchique, dans l'héritage multi-chemin, une classe enfant hérite de ses caractéristiques et fonctions de la classe parent et de plusieurs classes enfants de la classe parent. Étant donné que l'héritage multipath est basé sur l'héritage multiple, Java ne prend pas en charge son utilisation.

Pourquoi Java ne prend pas en charge l'héritage multiple

Le principal problème de l’héritage multiple est qu’il peut créer des ambiguïtés dans les classes enfants. Dans un livre blanc de 1995, le principal concepteur Java, James Gosling, a déclaré que les problèmes liés à l'héritage multiple étaient l'une des raisons pour lesquelles Java avait été créé. Les complexités inhérentes à l’héritage multiple sont plus clairement visibles dans le problème du diamant. Dans le problème du diamant, la classe parent A a deux classes enfants distinctes B et C ; c'est-à-dire que les classes enfants B et C étendent la classe A. Pause café #95.  Comment résoudre le problème de l'héritage multiple en Java - 3Nous créons maintenant une nouvelle classe enfant D qui étend à la fois la classe B et la classe C. Notez que nous avons un héritage multiple (D étend B et C), un héritage hiérarchique (B et C étendent A) et héritage multi-niveaux (D étend A, B et C). Dans le problème du diamant, les classes enfants B et C héritent d'une méthode de la classe parent A. B et C remplacent la méthode héritée. Mais les nouvelles méthodes en B et C se contredisent. La classe enfant finale D hérite de deux méthodes indépendantes et conflictuelles de ses multiples parents B et C. Il n'est pas clair quelle méthode de classe D doit être utilisée, donc une ambiguïté surgit. D'autres langages de programmation POO implémentent différentes méthodes pour résoudre l'ambiguïté de l'héritage multiple.

Comment résoudre le problème de l'héritage multiple en Java

Ce n’est pas parce que l’héritage multiple est problématique qu’il est inutile. Il existe de nombreuses situations dans lesquelles vous souhaiterez peut-être qu’une classe ait les fonctions de plusieurs autres classes. Pensez simplement au Tesla Roadster que vous achèterez lorsque vous deviendrez un développeur de logiciels extrêmement performant. Ses caractéristiques techniques sont basées à la fois sur la classe des voitures de sport et sur celle des véhicules électriques. Autre exemple : le navigateur via lequel vous lisez cet article. Il possède des fonctionnalités de la classe des solutions de confidentialité sur Internet et de la classe générale des navigateurs Internet. Mais vous ne pouvez pas étendre plusieurs classes en Java. Alors, comment ce langage résout-il le problème de l’héritage multiple ? Java utilise des structures appelées interfaces. Les interfaces sont des types abstraits qui définissent le comportement à implémenter par les classes. Parce qu'elles sont abstraites, les interfaces ne contiennent pas d'instructions détaillées sur leur comportement. Au lieu de cela, les classes fournissent des implémentations concrètes du comportement de l'interface. Les interfaces ont plusieurs caractéristiques déterminantes :
  • Contrairement aux classes, vous n’instanciez pas d’interfaces. Au lieu de cela, les classes implémentent des interfaces.
  • Les interfaces contiennent uniquement des définitions de constantes publiques et des en-têtes de méthode.
  • Les interfaces ne peuvent étendre que d'autres interfaces, pas des classes.
  • Les interfaces peuvent étendre plusieurs interfaces et les classes peuvent implémenter plusieurs interfaces.
Nous pouvons désormais contourner efficacement le problème du diamant à l’aide d’interfaces. En gardant à l'esprit que seules les interfaces ne peuvent étendre que d'autres interfaces et que toute classe nécessitant plusieurs caractéristiques d'héritage doit implémenter plusieurs interfaces, nous pouvons remplacer les classes à problèmes de diamant. Ce qui était autrefois les classes A, B et C deviennent désormais les interfaces A, B et C. Les interfaces B et C étendent toujours l'interface A, mais aucune de ces interfaces n'a de fonctionnalités spécifiques, seulement des comportements spécifiques. La classe D reste la classe chargée d'implémenter spécifiquement le comportement trouvé dans les interfaces B et C. Notez une différence clé : la classe D n'étend pas les interfaces B et C. Au lieu de cela, elle les implémente. De cette façon, vous n’avez pas réellement d’héritage multiple. Au lieu de cela, vous avez simplement recadré le problème.

Conclusion

Comprendre l'héritage est essentiel pour tout développeur Java efficace. Il est également tout aussi important de connaître les limites de l'héritage et la solution de contournement intégrée de Java aux problèmes d'héritage multiple traditionnels. Apprendre à créer des interfaces pour recréer les effets de l'héritage multiple en Java améliorera votre productivité et vos opportunités d'embauche.
Commentaires
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION