Héritage multiple

Un article de Wikipédia, l'encyclopédie libre.
Aller à : navigation, rechercher

En informatique, l’héritage multiple est un mécanisme de programmation orientée objet dans lequel une classe peut hériter de comportements et de fonctionnalités de plus d'une super-classe. Il s'oppose à l'héritage simple, dans lequel une classe hérite d'une unique super-classe.

Il est intégré par certains langages de programmation, par exemple C++, Eiffel ou Python. Pouvant poser des problèmes délicats, les concepteurs de nombreux autres langages comme Ada, C#, Fortran, Java, Objective-C, Ruby, Swift ou Visual Basic ont préféré ne pas le proposer directement.

Justification[modifier | modifier le code]

L'héritage multiple permet de combiner les comportements de plusieurs classes. Pour B. Stroustrup[1], l'inventeur du langage C++, ce mécanisme n'est pas en soi indispensable parce que les problèmes qu'il résout peuvent être résolus autrement, mais il vaut mieux disposer de l'héritage multiple quand c'est la solution la plus simple, que d'obliger à faire des contournements.

Problèmes[modifier | modifier le code]

L'héritage multiple peut poser des problèmes délicats, il y a donc controverse sur le fait de savoir si ses avantages surpassent ses inconvénients.

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. Ce cas est appelé problème du diamant. 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 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 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 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 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.

Mise en œuvre[modifier | modifier le code]

Interfaces[modifier | modifier le code]

Java a fait le compromis suivant : une classe hérite d'une seule classe parente (par défaut la classe Object), mais elle peut implémenter plusieurs interfaces. Le langage Delphi d'Embarcadero ou bien ceux de Microsoft comme C# et Visual Basic utilisent cette même approche.

Mixins[modifier | modifier le code]

Un mixin est une classe destinée à être composée par héritage multiple avec une autre classe pour lui apporter des fonctionnalités. C'est un cas de réutilisation d'implémentation. Chaque mixin représente un service qu'il est possible de greffer aux classes héritières.

Notes et références[modifier | modifier le code]

  1. voir "Do we really need class inheritance?" dans http://www.stroustrup.com/bs_faq2.html

Voir aussi[modifier | modifier le code]