To Petrroll :
Ono to je normalne, dvolezite je rozhranie - to co je zapuzdrene v triede ta nezaujima. Ak by si z "cicavca" urobil abstraktnu triedu tvoj priklad by fungoval. Otazka by nasledovala, ze preco? Ved nikdy by si nevedel urobit instanciu z abstraktnej triedy "new Savec()". Ako je mozne zeby to fungovalo?
Z hladiska "kompilacie" je zaujimave rozhranie. Ak vytvaras bazicku triedu, vies volat (priamo) len bazicke cleny. Ak je vsak trieda od nej odvodena (implementuje bazicke cleny => kompilator si je isty len nimi) mozes ich volat, nevies vsak zavolat priamo veci implementovane v odovdenej triede (neznamena, ze neexistuju!!!).
Cele OOP je v tomto pripade postavene na zaklade smernikov. Ten objekt (instancia) je len odkaz, kde sa data v pamati nachadzaju a ako sa da s nimi pracovat - kompilatoru si povedal, ze si si isty, ze tam je nejaky cicavec (nie vsak aky). Preto v kode vies pracovat len s tym, co "ponuka" cicavec - ale v pamati budes mat vytvoreneho "celeho" kona.
Tvoj priklad vies upravit:
[CODE]
object neoSavec = new Kun();
[/CODE]
Kazda trieda je odvodena od triedy "object" - to znamena, ze aj kona vies vytvorit v premennej object (pretoze cicavec je vlastne odovdeny od object). Problem je v tom, ze teraz neoSavec pre kompilator definuje len vlastnosti objektu - aj ked ty vies, ze sa tam nachadza kon (fyzizky v pamati). Takze vies velmi jednoducho pretypovat instanciu na tebou pozadovanu a tak vynutit kompilatoru co ty vies, ze je pravda:
[CODE]
object neoInstancia = new Kun(); // IBA JEDINA INSTANCIA
neoInstancia.Jez(); // CHYBA: object nepozna metodu Jez aj ked existuje v run-time
((Savec)neoInstancia).Jez(); // FUNGUJE (vynutili sme typ o ktorom vieme ze funguje)
((Savec)neoInstancia).JezTravu(); // CHYBA: Savec nepozna metodu aj iked existuje v run-time (rovnaka chyba ako hore)
((Kon)neoInstancia).Jez(); // FUNGUJE
((Kon)neoInstancia).JezTravu(); // FUNGUJE - typ KON definuje aj tuto metodu
((TextBox)neoInstancia).Text = "Text"; // CHYBA: V pamati sa nenachadza instancia TextBox - ale kompilator to nevie, toto zdochne len za behu programu - rovnako kompilator si "nie je isty" predchadzajucim pretypovanim - toto je totiz na tebe
[/CODE]
Zhrnute a podciarknute:
Neplet si run-time a rozhranie. V konecnom dosledku to, ze ty metody "nevidis" neznamena, ze tam nie su. Na vytvorenie instancie kona si pouzil predka z nizsej urovne, preto nemozes vidiet jeho metody. Vidis len tu, ktora je definovana v predkovi a to, ze ona (interne v pamati) vola nieco o com ty nevies v kode, to je v tomto pripade irelevantne.