Middle
V jakých situacích je dědičnost v objektově orientovaném programování užitečná a kdy je třeba se jí vyhnout?
sobes.tech AI
Odpověď od AI
Dědičnost je užitečná pro:
- Opakované použití kódu: Obecná funkčnost je přesunuta do základní třídy.
- Vytváření hierarchií typů (is-a vztah): Když odvozená třída je variací základní třídy.
- Polymorfismus: Možnost zpracovávat objekty různých typů prostřednictvím společného rozhraní základní třídy.
- Rozšíření funkčnosti: Přidání nových metod nebo polí k existující třídě.
Vyhněte se dědičnosti, když:
- Porušuje princip Liskovovy substituce: Odvozená třída nemůže plně nahradit základní třídu bez změny správnosti programu.
- Vytváří se pevné spojení mezi třídami: Změny v základní třídě mohou nežádoucím způsobem ovlivnit všechny odvozené třídy.
- Je potřeba kombinovat funkčnost z různých nesouvisejících zdrojů (has-a vztah): Je lepší použít kompozici.
- Hierarchie je příliš složitá: Hluboké řetězce dědičnosti jsou těžko udržovatelné a pochopitelné.
- Dědičnost pro opakované použití kódu, když funkčnost není společným "typem": Je lepší použít pomocné třídy nebo delegaci.
// Příklad, kdy je dědičnost užitečná
open class Animal {
open fun makeSound() {
println("Obecný zvuk zvířete")
}
}
class Dog : Animal() { // Dog JE-JEDEN Animal
override fun makeSound() {
println("Haf")
}
}
class Cat : Animal() { // Cat JE-JEDEN Animal
override fun makeSound() {
println("Mňau")
}
}
// Příklad, kdy je vhodnější složení než dědičnost pro vztah "has-a"
class Engine {
fun start() { println("Motor spuštěn") }
}
// Místo dědění od Engine pro Car
// class Car : Engine() // Špatný návrh, Car NENÍ-JEDEN Engine
class Car {
private val engine = Engine() // Car MÁ-Engine
fun drive() {
engine.start()
println("Auto jede")
}
}