Qu'est-ce que l'héritage ?
L'héritage est un mécanisme fondamental de la programmation orientee objet qui permet à une classe (enfant ou sous-classe) de reprendre automatiquement les attributs et méthodes d'une autre classe (parent ou superclasse). L'héritage etablit une relation "est-un" (is-a) entre les classes et permet la réutilisation et l'extension du code existant.
Héritage simple vs multiple
L'héritage simple (une seule classe parente) est supporté par la majorité des langages : Java, C#, TypeScript, Python, Ruby. L'héritage multiple (plusieurs classes parentes) est supporté par Python et C++, mais pas par Java ou C#. L'héritage multiple peut créer le "problème du diamant" (deux parents ayant une méthode de même nom). Python le résout avec le MRO (Method Résolution Order) et l'algorithme C3 linearization.
Mécanismes associes
La redefinition (override) permet à la classe enfant de fournir sa propre implémentation d'une méthode heritee. Le mot-cle super (ou base en C#) appelle l'implémentation du parent. Les classes abstraites contiennent des méthodes sans implémentation que les enfants doivent définir. Les interfaces (Java, TypeScript, C#) définissent un contrat sans implémentation, permettant l'héritage multiple de comportement.
Composition vs héritage
Le principe "composition over inheritance" recommande de privilegier la composition (un objet contient d'autres objets) plutôt que l'héritage profond. L'héritage cree un couplage fort entre parent et enfant : modifier le parent peut casser les enfants. La composition est plus flexible : on peut changer le comportement à l'exécution en remplacant un composant. Les design patterns comme Strategy, Decorator et Observer favorisent la composition.
Héritage dans les langages modernes
En Java, extends pour l'héritage de classe, implements pour les interfaces. En JavaScript/TypeScript, class extends avec le prototype chain sous le capot. En Python, héritage multiple avec super() et MRO. En Go, pas d'héritage classique, mais de la composition via l'embedding de structs. En Rust, pas d'héritage de classes, mais les traits offrent la réutilisation de comportement. La tendance moderne est de limiter l'héritage à un ou deux niveaux et de privilegier les interfaces et la composition.