Middle
Kokiose situacijose objektų orientuoto programavimo paveldėjimas yra naudingas ir kokiose situacijose reikėtų nuo jo susilaikyti?
sobes.tech AI
Atsakymas iš AI
Paveldėjimas yra naudingas:
- Kodo pakartotinis naudojimas: Bendros funkcijos yra išvedamos į bazinį klasę.
- Tipų hierarchijos kūrimas (is-a santykis): Kai vaikinis klasė yra tėvinės klasės rūšis.
- Polimorfizmas: Galimybė apdoroti skirtingų tipų objektus per bendrą bazinio interfeiso sąsają.
- Funkcionalumo plėtra: Naujų metodų ar laukų pridėjimas prie esamo klases.
Reikia atsisakyti paveldėjimo, kai:
- Liskovo pakaitumo principas pažeidžiamas: Vaikinis klasė negali visiškai pakeisti tėvinės klasės be programos teisingumo pažeidimo.
- Sukuriama griežta ryšys tarp klasių: Pakeitimai bazinėje klasėje gali nepageidautinai paveikti visas vaikinės klases.
- Reikia sujungti funkcionalumą iš skirtingų nesusijusių šaltinių (has-a santykis): Geriau naudoti kompoziciją.
- Per didelis hierarchijos sudėtingumas: Gilių paveldėjimo grandinių palaikymas ir supratimas yra sudėtingas.
- Paveldėjimas kodo pakartotiniam naudojimui, kai funkcionalumas nėra bendras "tipas": Geriau naudoti paslaugų klases arba delegavimą.
// Pavyzdys, kai paveldėjimas yra naudingas
open class Animal {
open fun makeSound() {
println("Bendras gyvūno garsas")
}
}
class Dog : Animal() { // Dog IS-A Animal
override fun makeSound() {
println("Au")
}
}
class Cat : Animal() { // Cat IS-A Animal
override fun makeSound() {
println("Miau")
}
}
// Pavyzdys, kai kompozicija yra pranašesnė už paveldėjimą "has-a" santykyje
class Engine {
fun start() { println("Variklis įjungtas") }
}
// Vietoj paveldėjimo iš Engine
// class Car : Engine() // Blogas dizainas, Car NĖRA Engine
class Car {
private val engine = Engine() // Car HAS-A Engine
fun drive() {
engine.start()
println("Mašina važiuoja")
}
}