<< Dedičnosť | Obsah | Abstraktné triedy >>
No hej, poviete si, ale ako my teraz budeme volať metódy dajUmiestnenie()
? Odpoveďou je polymorfizmus, alebo po slovensky viactvarovosť (slovenský ekvivalent nikto nepoužíva). Ide vlastne o dôsledok mechanizmu volania metód na objektoch. Keď cez niektorú premennú referencujúcu daný objekt zavoláme nejakú metódu, postupuje sa nasledovne:
Toto pravidlo platí bez ohľadu na to akého typu bola premenná referencujúca daný objekt. V predchádzajúcej kapitolke sme však povedali, že vieme volať iba metódy, ktoré nám umožní typ premennej. Dopíšeme si teda metódu dajUmiestnenie()
aj do triedy Film
. Reálne sa však táto metóda v našom programe nikdy nezavolá, keďže v poli filmy
nebudeme mať objekty typu Film
, ale iba objekty jej potomkov. Hovoríme tomu, že metódy v potomkoch prekrývajú túto metódu.
Situácia sa pridaním tejto metódy zmenila nasledovne:
Teraz si môžeme v triede ZoznamFilmov
urobiť akýsi výpis filmov s ich umiestneniami. Každý objekt si zavolá metódu dajUmiestnenie()
zo svojej triedy.
Malý bonus nakoniec: Ak by sme chceli aby aj metóda retazecPreVypis()
vrátila okrem pôvodných informácií o filme aj informáciu o umiestnení, môžeme v triede Film
modifikovať túto metódu tak, že v nej zavoláme metódu dajUmiestnenie()
nasledovne:
Prečo je to tak? Lebo platí postup pri volaní metódy spomínaný za začiatku tejto kapitolky. Dá sa to predstaviť aj tak, že objekt si osvojí všetky metódy, ktoré dostal od svojej triedy, a z tried predkov si pozbiera postupne iba tie metódy, ktoré zatiaľ nemá. Teda ak sú nejaké metódy prekryté, použije tie, ktoré má v hierarchii dedenia k sebe bližšie.
V tomto prípade máme napríklad objekt triedy FilmNaDvd
, tak tento objekt má metódu dajUmiestnenie()
z triedy FilmNaDvd
a metódu retazecPreVypis()
z triedy Film
lebo túto metódu potomkovia nemajú. Takže, keď táto osvojená metóda retazecPreVypis()
zavolá dajUmiestnenie()
, použije tú prekrytú metódu, ktorú si osvojil z triedy FilmNaDvd
a nie metódu z triedy Film
.
Niekedy sa stane, že z nejakého dôvodu chceme z oddedenej triedy (napr. FilmNaDvd
) zavolať metódu z rodičovskej triedy (v tomto prípade Film
) ktorú sme si v oddedenej triede prekryli. V našom príklade sme prekryli metódu dajUmiestnenie()
. Ak chceme aj tak zavolať pôvodnú metódu použijeme slovíčko super
, ktoré označuje rodičovskú triedu.