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")
}
}