Middle
Dans quelles situations l'héritage en programmation orientée objet est-il utile et dans quels cas faut-il l'éviter?
sobes.tech IA
Réponse de l'IA
L'héritage est utile pour :
- Réutilisation du code : La fonctionnalité commune est placée dans une classe de base.
- Création de hiérarchies de types (relation is-a) : Lorsqu'une classe fille est une variante de la classe parente.
- Polymorphisme : La capacité de traiter des objets de différents types via une interface commune de la classe de base.
- Extension de la fonctionnalité : Ajouter de nouvelles méthodes ou champs à une classe existante.
Il faut éviter l'héritage lorsque :
- Le principe de substitution de Liskov est violé : La classe fille ne peut pas remplacer complètement la classe de base sans modifier la correction du programme.
- Une relation rigide est créée entre les classes : Les changements dans la classe de base peuvent affecter indésirablement toutes les classes filles.
- Il est nécessaire de combiner des fonctionnalités provenant de sources non liées (relation has-a) : Il vaut mieux utiliser la composition.
- Complexité excessive de la hiérarchie : Les chaînes profondes d'héritage sont difficiles à maintenir et à comprendre.
- L'héritage pour la réutilisation du code lorsque la fonctionnalité n'est pas un "type" commun : Il vaut mieux utiliser des classes utilitaires ou la délégation.
// Exemple, lorsque l'héritage est utile
open class Animal {
open fun makeSound() {
println("Son animal générique")
}
}
class Dog : Animal() { // Dog EST-UNE Animal
override fun makeSound() {
println("Wouf")
}
}
class Cat : Animal() { // Cat EST-UNE Animal
override fun makeSound() {
println("Miaou")
}
}
// Exemple, lorsque la composition est préférable à l'héritage pour la relation "has-a"
class Engine {
fun start() { println("Moteur démarré") }
}
// Au lieu d'hériter de Engine pour Car
// class Car : Engine() // Mauvais design, Car N'EST PAS-UNE Engine
class Car {
private val engine = Engine() // Car A-UNE Engine
fun drive() {
engine.start()
println("Conduite de la voiture")
}
}