Sobes.tech
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")
    }
}