Qu'est-ce que l'heritage ?
L'heritage est un mecanisme fondamental de la programmation orientee objet qui permet a une classe (enfant ou sous-classe) de reprendre automatiquement les attributs et methodes d'une autre classe (parent ou superclasse). L'heritage etablit une relation "est-un" (is-a) entre les classes et permet la reutilisation et l'extension du code existant.
Heritage simple vs multiple
L'heritage simple (une seule classe parente) est supporte par la majorite des langages : Java, C#, TypeScript, Python, Ruby. L'heritage multiple (plusieurs classes parentes) est supporte par Python et C++, mais pas par Java ou C#. L'heritage multiple peut creer le "probleme du diamant" (deux parents ayant une methode de meme nom). Python le resout avec le MRO (Method Resolution Order) et l'algorithme C3 linearization.
Mecanismes associes
La redefinition (override) permet a la classe enfant de fournir sa propre implementation d'une methode heritee. Le mot-cle super (ou base en C#) appelle l'implementation du parent. Les classes abstraites contiennent des methodes sans implementation que les enfants doivent definir. Les interfaces (Java, TypeScript, C#) definissent un contrat sans implementation, permettant l'heritage multiple de comportement.
Composition vs heritage
Le principe "composition over inheritance" recommande de privilegier la composition (un objet contient d'autres objets) plutot que l'heritage profond. L'heritage 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 a l'execution en remplacant un composant. Les design patterns comme Strategy, Decorator et Observer favorisent la composition.
Heritage dans les langages modernes
En Java, extends pour l'heritage de classe, implements pour les interfaces. En JavaScript/TypeScript, class extends avec le prototype chain sous le capot. En Python, heritage multiple avec super() et MRO. En Go, pas d'heritage classique, mais de la composition via l'embedding de structs. En Rust, pas d'heritage de classes, mais les traits offrent la reutilisation de comportement. La tendance moderne est de limiter l'heritage a un ou deux niveaux et de privilegier les interfaces et la composition.