Potíže s dědičností

Vtip

Dědičnost. Nejlepší objektově-orientovaný způsob, jak se pohádat a naštvat ty před námi i po nás.

Přínosy dědičnosti

  • Je fajn, ušetříme psaní kódu i jeho objem (kód je tam jednou), omezí se redundance.

  • Někdy dokonce i předejdeme chybám tím, že chybu opravíme na jednom místě a OK, protože efekt se hned bez dalšího promítne do všech podtříd = je poděděn.

  • Můžeme využít polymorfismus, kdy jsme schopni jednotně obsloužit více typů objektů

  • například Employee, Manager nebo Student jsou všechno osoby Person a mají tedy jméno getName()

Hlavní omezení

  • Dědičnost je příklad silné (těsné) závislosti.

  • Změna v rodičovské třídě (nadtřídě) má silný vliv na funkci, případně i kompilovatelnosti podtříd.

  • Metodu, která se dá překrýt v podtřídě, nesmíme volat z konstruktoru!

(Ne)použití virtuálních metod v konstruktorech

  • Metodu, která se dá překrýt v podtřídě, nesmíme volat z konstruktoru!

  • Příklad "prémiový" bankovní účet, kde má být po vytvoření hned 1000 Kč.

public class PremiumAccount extends Account {
    public PremiumAccount() {
        setBalance(1000); // CHYBA, pokud je setBalance() v nadride protected bez final
    }
}

Dědičnost vs. spolupráce objektů

  • Dědičnost se dá vždy nahradit spoluprací objektů

  • Např. namísto Mamal a Bird lišících se povrchem těla a rozšiřujících třídu Animal může mít pouze třídu Animal odkazující na …​

- objekt BodySurface ve stavu "hair" nebo "feathers".
- Dědičnost se často vyskytuje v návrhových vzorech, kde je ale přesně cílená a splňuje "best practices".