Polymorfismus - dostupnost tříd - rodič - potomek – .NET – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Polymorfismus - dostupnost tříd - rodič - potomek – .NET – Fórum – Programujte.comPolymorfismus - dostupnost tříd - rodič - potomek – .NET – Fórum – Programujte.com

 

Petrroll0
Stálý člen
21. 4. 2010   #1
-
0
-

Zdar mám další "problém" teď mi fungují věci co by dle mého přesvědčení fungovat neměli. Mám kód (jen na ukázku)

class Program

{
static void Main(string[] args)
{
Kun mujKun = new Kun();
Savec Neo = mujKun;
Neo.jez();
}
}
class Savec
{
public virtual void jez()
{
Console.WriteLine("Frrrr");
}
}
class Kun : Savec
{
override public void jez()
{
jezTravu("Chrr");
}
public void jezTravu(string a)
{
Console.WriteLine(a);
}
}


Jakto že to jde zkompilovat, když volám metodu jez objektu Neo tak ta metoda volá metodu jezTravu, ale ta není obsažena v rodičovské třídě, tudíž by neměla být dostupná ne? Mám to chápat že jsou když potomkovou třídu (její instanci) přiřadím do proměnné typu rodič tak sice metody potomka dostupné nebudou ale pokud je budu volat z přetížených tříd rodiče tak dostupné budou?

PS: Doufám že neobtěžuji začátečnickými dotazy.

Nahlásit jako SPAM
IP: 92.62.224.–
21. 4. 2010   #2
-
0
-

Zdravím,

takové chování je naprosto správné. Já tyhle teoretický věci neumím slovy dost dobře popsat, takže to kdyžtak přenechám někomu jinému. Říkal jsi, že už jsi pochopil rozhraní, ten princip je v podstatě podobný, zkus v tom hledat určitou analogii.

BTW: Nedodržuješ jmenné konvence definované pro jazyk C#. Zkus se na to trochu podívat. Ne, že by to bylo to nejdůležitější, ale třeba mně to dost vadí.

Nahlásit jako SPAM
IP: 88.146.16.–
Dušan Janošík | web: djanosik.cz, @djanosik
Foowie0
Newbie
21. 4. 2010   #3
-
0
-

"Uvnitř se to chová stále jako kůň, jenom pro okolí je to savec"

Nahlásit jako SPAM
IP: 62.129.36.–
Petrroll0
Stálý člen
21. 4. 2010   #4
-
0
-

2Foowie: Krásně řečeno, díky.
2Djanosik: Kde jsem porušil jmenné konvence? Teda Neo měl být neo, ale jinak o chybách nevím.

Nahlásit jako SPAM
IP: 92.62.224.–
21. 4. 2010   #5
-
0
-

To Petrroll : Jo, to je jedna věc. Pak jde ještě o názvy metod, měl by se zde používat PascalCase, tj. první písmeno velké (až na výjimky).

Nahlásit jako SPAM
IP: 88.146.16.–
Dušan Janošík | web: djanosik.cz, @djanosik
LiborBes
~ Anonymní uživatel
47 příspěvků
25. 4. 2010   #6
-
0
-

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.

Nahlásit jako SPAM
IP: 88.212.40.–
Petrroll0
Stálý člen
26. 4. 2010   #7
-
0
-

Díky za vyčerpávající odpověď.

Nahlásit jako SPAM
IP: 92.62.224.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 39 hostů

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý