Héritage multiple
Source: Wikipédia sous licence CC-BY-SA 3.0.
La liste des auteurs de cet article est disponible ici.

Certains langages de programmation orientés objets (par exemple C++, Eiffel) permettent l'héritage multiple, dans lequel une classe peut hériter de comportements et de fonctionnalités de plus d'une super-classe. Au contraire de l'héritage simple, dans lequel une classe hérite d'une unique super-classe.

L'héritage multiple (Certains langages de programmation orientés objets (par exemple C++, Eiffel) permettent l'héritage multiple, dans lequel une classe peut hériter de...) peut poser des problèmes délicats, il y a donc controverse sur le fait de savoir si ses avantages surpassent ses inconvénients. Java a fait le compromis suivant : il permet à une classe d'hériter des interfaces de plus d'un de ses parents (c’est-à-dire que l'on peut spécifier qu'une classe doit avoir toutes les méthodes exposées à l'extérieur de ses parents d'interface (Une interface est une zone, réelle ou virtuelle qui sépare deux éléments. L’interface désigne ainsi ce que chaque élément a besoin de connaître de l’autre...), et permettre au compilateur de s'en assurer), mais elle peut hériter les méthodes et données (Dans les technologies de l'information (TI), une donnée est une description élémentaire, souvent codée, d'une chose, d'une transaction d'affaire, d'un événement, etc.) d'une unique classe parente. Les langages de Microsoft (Microsoft Corporation (NASDAQ : MSFT) est une multinationale américaine de solutions informatiques, fondée par Bill Gates et Paul Allen, dont le revenu annuel a...) comme C# et Visual Basic (En programmation, BASIC est un acronyme pour Beginner's All-purpose Symbolic Instruction Code. qui désigne une famille de langages de programmations de haut niveau.) implémentent cette même approche.

Le principal problème que pose l'héritage multiple provient d'entités comme une méthode ou un membre qui sont présents plusieurs fois dans les ancêtres d'une classe. Par exemple si on définit une classe App pour les appareils portables alimentés par une batterie, une classe Tel pour les téléphones portables qui hérite de App, une classe Ord pour les ordinateurs portables qui hérite de App et enfin une classe TelOrd pour les téléphones servant aussi d'ordinateurs qui hérite de Ord et de Tel. Alors on ne sait pas très bien si les instances de TelOrd comportent une ou deux batteries et sous quel nom les différencier. Une solution consiste à rajouter un mécanisme dans le langage pour choisir entre la fusion (En physique et en métallurgie, la fusion est le passage d'un corps de l'état solide vers l'état liquide. Pour un corps pur, c’est-à-dire pour une substance...) des entités répétées ou le renommage de celles-ci afin de séparer les entités. Cette solution est implémentée dans Eiffel ou Ocaml pour ne citer que les plus connus. C++ de son côté propose l'héritage virtuel comme outil (Un outil est un objet finalisé utilisé par un être vivant dans le but d'augmenter son efficacité naturelle dans l'action. Cette augmentation se traduit par la simplification des actions entreprises, par une...) complémentaire moins ambitieux. La finesse des mécanismes sémantiques mis en jeu dans l'héritage multiple a rebuté beaucoup d'utilisateurs et explique la mauvaise réputation qu'il a acquise dans une partie de la communauté des développeurs.

Un second niveau de problèmes apparaît quand il s'agit de compiler ou d'exécuter des programmes utilisant des classes à héritage multiple. En effet dans le cas d'appel de méthodes polymorphiques (quand une même méthode a plusieurs versions dans des classes héritant les unes des autres), il faut trouver quelle méthode doit être exécutée. Dans le cadre d'un héritage simple, les ancêtres d'une classe forment une liste et il est facile de créer une table de liaison dynamique (Le mot dynamique est souvent employé désigner ou qualifier ce qui est relatif au mouvement. Il peut être employé comme :) permettant avec un simple test de trouver la bonne version. Dans le cadre d'un héritage multiple les ancêtres d'une classe forment maintenant un graphe (Le mot graphe possède plusieurs significations. Il est notamment employé :) et la table de liaison dynamique est plus difficile à créer. Néanmoins des algorithmes de compilation existent pour cela ; il est ainsi possible de résoudre les héritages multiples avec le même coût à l'exécution que l'héritage simple. Évidemment il est impossible d'utiliser ces techniques avec des langages qui ne sont pas compilés ; dans ce cas, il faut parcourir le graphe d'héritage pendant l'exécution, ce qui peut être assez long.

Page générée en 0.058 seconde(s) - site hébergé chez Amen
Ce site fait l'objet d'une déclaration à la CNIL sous le numéro de dossier 1037632
Ce site est édité par Techno-Science.net - A propos - Informations légales
Partenaire: HD-Numérique