Middle
Millistes olukordades on objektorienteeritud programmeerimises pärimine kasulik ja millal peaks sellest loobuma?
sobes.tech AI
Vastus AI-lt
Pärilusus on kasulik:
- Koodi taaskasutus: Ühine funktsionaalsus paigutatakse baasklassile.
- Tüüpide hierarhia loomine (is-a suhe): Kui alamklass on vanemklassi liik.
- Polümorfism: Võimalus töödelda erinevat tüüpi objekte ühise liidese kaudu.
- Funktsionaalsuse laiendamine: Uute meetodite või väljade lisamine olemasolevasse klassi.
Pärilusest tuleks loobuda, kui:
- Liskovi asenduspõhimõte on rikutud: Alamklass ei saa täielikult asendada vanemklassit ilma programmi korrektsust muutmata.
- Suunatakse range side klasside vahel: Muudatused baasklassis võivad soovimatult mõjutada kõiki alamklasse.
- Vajalik on funktsionaalsuse ühendamine erinevatest mitteseotud allikatest (has-a suhe): Kasutada on parem kompositsiooni.
- Hierarhia on liiga keeruline: Sügavad päriluse ahelad on hooldamise ja mõistmise jaoks rasked.
- Pärilust koodi taaskasutuseks, kui funktsionaalsus ei ole ühine "tüüp": Kasutada on parem teenusklasse või delegatsiooni.
// Näide, kui pärilusus on kasulik
open class Animal {
open fun makeSound() {
println("Üldine looma hääl")
}
}
class Dog : Animal() { // Dog IS-A Animal
override fun makeSound() {
println("Vau")
}
}
class Cat : Animal() { // Cat IS-A Animal
override fun makeSound() {
println("Miau")
}
}
// Näide, kui kompositsioon on eelistatavam kui pärilusus "has-a" suhtes
class Engine {
fun start() { println(" Mootor käivitus") }
}
// Mootori pärandamine Car jaoks ei ole soovitatav
// class Car : Engine() // Halb disain, Car EI OLE Engine
class Car {
private val engine = Engine() // Car HAS-A Engine
fun drive() {
engine.start()
println("Auto sõidab")
}
}