Héritage multiple

terme utilisé dans la programmation orientée objet

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 ne peut hériter que d'une seule super-classe.

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

Utilité modifier

L'héritage multiple sert à combiner les comportements de plusieurs classes.

Selon B. Stroustrup[1], l'inventeur du langage C++, ce mécanisme est facultatif parce que les problèmes qu'il résout peuvent être résolus par d'autres moyens.

Problèmes modifier

L'héritage multiple génère parfois des erreurs de compilation.

Le principal problème rencontré est la présence de différentes implémentations par les super-classes d'une certaine classe pour une même déclaration. Ce problème est aussi connu sous le nom du problème du diamant.

Un autre problème est la compilation de classes à héritage multiple. En effet, lorsqu'une méthode polymorphique est appelée, il faut déduire la bonne implémentation à exécuter. Si la méthode est le résultat d'un héritage simple, elle n'a alors qu'une seule implémentation possible, et il ne sera donc pas difficile retrouver l'implémentation. Si la méthode est le résultat d'un héritage multiple, elle a alors plusieurs implémentations possibles. Il faut donc choisir l'une des implémentations concurrentes. C'est problématique car différentes implémentations peuvent avoir des effets de bord différents, résultant donc en un comportement indéfini (undefined behavior).

La compilation d'une classe à héritage multiple n'est par contre pas nécessairement moins efficace que la compilation d'une classe à héritage simple[réf. nécessaire].

Solutions modifier

Priorisation modifier

Eiffel et Python proposent de prioriser les méthodes, indiquant lors de la déclaration d'héritage quelle méthode prendre dans les situations de polymorphisme en cas de conflit.

Méthodes virtuelles modifier

Une méthode virtuelle, ou encore « méthode polymorphique » est une méthode destinée à pouvoir être redéfinie dans les sous-classes de la classe de celle-ci.

On en retrouve dans plusieurs langages orientés objet.

Interfaces modifier

Une interface est une classe complètement abstraite, c'est-à-dire qu'elle propose la déclaration de fonctionnalités tout en empêchant leur définition.

On en retrouve notamment en Java, en Delphi, en C# et en Visual Basic. Dans ces langages, une classe ne peut hériter que d'une seule super-classe et peut implémenter plusieurs super-interfaces.

Mixins modifier

Un mixin est exclusivement une super-classe. En d'autres mots, un mixin est une classe servant exclusivement à être hérité.

Traits modifier

Un trait est un mixin qui rend impossible les collisions causés par l'héritage multiple.

On en retrouve notamment en Scala et en PHP.

Notes et références modifier

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

Voir aussi modifier