Dědičnost - změna metod rodičovských metod volaných z kontruktoru – .NET – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu
Reklama
Reklama

Dědičnost - změna metod rodičovských metod volaných z kontruktoru – .NET – Fórum – Programujte.comDědičnost - změna metod rodičovských metod volaných z kontruktoru – .NET – Fórum – Programujte.com

 

Hledá se programátor! Plat 1 800 € + bonusy (firma Boxmol.com)
Xelenderus
~ Anonymní uživatel
12 příspěvků
4. 4. 2011   #1
-
0
-

Zdravím,
V třídě rodiče mám jednu protected metodu, tu volám z kontruktoru. V potomkovo kontruktoru poté volám základní kontruktor a danou metodu zde mám předefinovanou. Je nějak možné z potomka zamezit volání původní metody a zavolat namísto toho novou implementaci?

class jedna

{
public jedna()
{
stihej();
}
protected void stihej()
{
Console.WriteLine("stihej");
}
}

class dva : jedna
{
public dva()
:base()
{
stihej();
}
new protected void stihej()
{
Console.WriteLine("nestihej");
}
}

Nahlásit jako SPAM
IP: 92.62.224.–
Reklama
Reklama
4. 4. 2011   #2
-
0
-

To Xelenderus : Základem mohou být slova override a virtual. Doporučuji prozkoumat, ale goralský čaj dělá své, takže nevím, zda to odpovídá tvým požadavkům.

Nahlásit jako SPAM
IP: 89.203.157.–
Dušan Janošík | web: djanosik.cz, @djanosik
m->29+6
Super člen
4. 4. 2011   #3
-
0
-

Hej, metódu základnej triedy definuješ ako virtual a odvodená trieda ju môže prepísať pomocou override. To už ale povedal djanosik. Čo som chcel ja povedať je to, že prekryté metódy by sa v konštruktore používať nemali. Pretože:
1) Vytvoríš triedu dva, ktorá zavolá konštruktor jedna.
2) Konštruktor jedna zavolá metódu stihej.
3) Táto metóda je ale prekrytá a tak sa zavolá jej prekrytá verzia dva::stihej.
4) Objekt dva ale stále nie je vytvorený, pretože sa ešte len tvorí objekt jedna (predok).
5) Ak by teda prekrytá metóda používala fieldy z dva (tvoja len vypisuje takže v pohode, ale nikdy nevieš ako ju neskôr ty alebo niekto upraví a zabudne na to, že sa volá v konštruktore jedna), tak sú fieldy neinicializované čo je problém.

Teda, v C# som sa začal rýpať len nedávno, ale v Jave to funguje takto. Aspoň čo som sa dočítal. Ak to tak nie je tak ma hádam niekto opraví aby som tu nehlásal bludy.

Nahlásit jako SPAM
IP: 83.240.51.–
ahl
~ Anonymní uživatel
8 příspěvků
5. 4. 2011   #4
-
0
-

Tohle nedělej, volání virtuální metody v konstruktoru je "bad practise". Obecně bych to chápal jako chybu v návrhu a nástroje pro statickou analýzu kódu ti to taky omlátí o hlavu. Konstruktor se používá pouze na inicializaci třídy a složitější logika v něm nemá co dělat. Narušuješ tím zapouzdření předka a v některých případech to může i shodit program. Např.



class jedna
{

private int[] a;
public jedna()
{
stihej();
for(int i =0; i < a.Length; i ++) //a je null
{
a[i] = i;
}
}
protected virtual void stihej()
{
Console.WriteLine("stihej");
a = new int[10];
}
}

class dva : jedna
{
public dva()
:base()
{
stihej();
}
new protected override void stihej()
{
Console.WriteLine("nestihej");
}
}

Při vytváření instance dva to, protože a je null.

Nahlásit jako SPAM
IP: 84.42.162.–
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, 92 hostů

Podobná vlákna

Volani metod v C++ — založil fish23

Překrývání Metod — založil Michal

Problém ohledně metod — založil Pablo.O

DLL Export metod — založil Martin

 

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