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