Dedičnosť tried je vlastnosť dovoľujúca odvodiť novú triedu tak, aby bola založená na predošlej a zdieľala jej vlastnosti, metódy alebo premenné.
Pomocou dedičnosti môžeme zabezpečiť jednoduché odvodzovanie tried a odstránenie opakovania toho istého kódu. Okrem toho to dovoľuje rozširovanie už existujúcich tried a priradenie objektov rôznych typov k jednej premennej.
Základná trieda [base class]
Základná trieda je trieda, z ktorej odvodzujeme triedy – rodič. Základná trieda je obyčajná trieda, a tak je možné odvodzovať z akejkoľvek triedy, dokonca aj z už odvodenej triedy.
public class Stvorec { double a; double b; double c; double d; public Stvorec(int strana) { a = strana; b = a; c = a; d = a; } public double vypocitajObvod() { return a+b+c+d; } }
Toto by bola trieda, ktorá obsahuje metódu na vypočítanie obsahu štvorca a zadaním dĺžky strany ju automaticky priradí všetkým stranám. Viem že by bolo možné ukladať len jednu stranu a následne použiť return 4*a, ale pre tento príklad použijeme túto triedu.
Odvodenie triedy [class derivation]
Ďalším krokom je vytvoriť odvodenú triedu [derived class] – to sa robí použitím znaku : (dvojbodka) za meno odvodenej triedy a zadaním mena základnej triedy.
public class Obdliznik : Stvorec
Následne je možné písať triedu, ako vám to vyhovuje, pri čom môžete využívať už napísane metódy a premenné základnej triedy.
public class Obdlznik : Stvorec { public Obdliznik(int dlzkaA, int dlzkaB) : base(dlzkaA) { b = dlzkaB; d = dlzkaB; } }
V tomto príklade sme v konštruktore priradili premenným b a d hodnotu strany B. Tieto premenné už boli definované v základnej triede, a tak ich môžeme použiť. čo je na konštruktore zvláštne, je použitie dvojbodky a slova base. To určuje, že rozširuje konštruktor pôvodnej triedy a ako parameter dostáva dlzkaA. Ak by sme kódy konštruktorov napísali tak ako sa vykonajú bolo by to :
a = dlzkaA; b = dlzkaA; c = dlzkaA; d = dlzkaA; b = dlzkaB; d = dlzkaB;
Tým sme správne nastavili premenné. Ak by ste teraz niekde vytvorili objekt typu Obdlznik, mohli by ste použiť metódu vypocitajObvod, čo je metóda typu Stvorec. Tá by spočítala strani a,b,c,d z objektu a dala vám obvod obdĺžnika.
Zákaz odvoditeľnosti
Triede, ktorú vytvoríte, môžete zakázať odvoditeľnosť – tým pádom nieje možné túto triedu použiť ako základnú. Je to možné vynútiť použitím slova sealed.
sealed class Obdlznik { }
Objekty odvodených tried
Objekty odvodených tried sú úžasná vec a pomáhajú napríklad pri tvorbe API. Je totiž možné uložiť objekt typu odvodenej triedy, do premennej nadradeného typu.
Obdlznik obdlznik = new Obdlznik(4,6); Stvorce stale_obdlznik = obdlznik;
Vytvorili sme si objekt typu Obdlznik a ten sme následne uložili do premennej typu Stvorec. Tento objekt v skutočnosti stále zostal typu Obdlznik a jeho metódy a premenné zostali zachované a funkčné. Na použitie sú však dostupné len tie metódy, ktoré už obsahoval aj typ Stvorec.
Priradiť je možné ja objekt rodičovského typu k nadradenému – tu už na radu prichádza tzv. pretypovanie [casting]. Pretypovanie prebieha zadaním mena nového typu do zátvoriek pred premennú.
Stvorec stvorec = new Stvorec(3); Obdlznik obdlznik = (Obdlznik)stvorec;
Pri pretypovaní týmto smerom je nutné použiť zátvorky. Vy výsledku však tento objekt nemusí fungovať.
Toto bol prví diel o dedičnosti tried, v ktorom sme si ukázali ako sa dajú vytvoriť odvodené triedy a nabudúce budeme v dedičnosti pokračovať a povieme si niečo o Polymorfizme a Abstraktných triedach a metódach.