Sobes.tech
Middle

In welke situaties is erfelijkheid in objectgeoriënteerd programmeren nuttig en in welke gevallen moet ervan worden afgezien?

sobes.tech AI

Antwoord van AI

Erfelijkheid is nuttig voor:

  • Herbruikbaarheid van code: Gemeenschappelijke functionaliteit wordt in een basisklasse geplaatst.
  • Het creëren van type-hiërarchieën (is-a relatie): Wanneer een subklasse een variant is van de hoofdklasse.
  • Polymorfisme: De mogelijkheid om objecten van verschillende types te behandelen via een gemeenschappelijke interface van de hoofdklasse.
  • Uitbreiding van functionaliteit: Het toevoegen van nieuwe methoden of velden aan een bestaande klasse.

Vermijd erfelijkheid wanneer:

  • Het Liskov-substitutieprincipe wordt geschonden: De subklasse kan de hoofdklasse niet volledig vervangen zonder de correctheid van het programma te veranderen.
  • Er wordt een strakke koppeling tussen klassen gemaakt: Wijzigingen in de hoofdklasse kunnen onbedoeld alle subklassen beïnvloeden.
  • Het is nodig om functionaliteit van verschillende niet-gerelateerde bronnen te combineren (has-a relatie): Het is beter om compositie te gebruiken.
  • De hiërarchie wordt te complex: Diepe erfketens zijn moeilijk te onderhouden en te begrijpen.
  • Erfelijkheid voor codehergebruik wanneer functionaliteit geen gemeenschappelijk "type" is: Het is beter om hulpprogrammaklassen of delegatie te gebruiken.
// Voorbeeld, wanneer erfelijkheid nuttig is
open class Animal {
    open fun makeSound() {
        println("Algemeen dierengeluid")
    }
}

class Dog : Animal() { // Dog IS-EEN Animal
    override fun makeSound() {
        println("Woef")
    }
}

class Cat : Animal() { // Cat IS-EEN Animal
    override fun makeSound() {
        println("Miauw")
    }
}
// Voorbeeld, wanneer samenstelling de voorkeur heeft boven erfelijkheid voor "has-a" relatie
class Engine {
    fun start() { println("Motor gestart") }
}

// In plaats van erfelijkheid van Engine voor Car
// class Car : Engine() // Slechte ontwerp, Car IS-NIET-Engine

class Car {
    private val engine = Engine() // Car HEEFT-EEN Engine
    fun drive() {
        engine.start()
        println("Auto rijdt")
    }
}