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