Přidání metody do delegátu rodiče – .NET – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Přidání metody do delegátu rodiče – .NET – Fórum – Programujte.comPřidání metody do delegátu rodiče – .NET – Fórum – Programujte.com

 

Xelenderus
~ Anonymní uživatel
12 příspěvků
23. 4. 2011   #1
-
0
-

Zdravím, mám další problém související s dědičností.
V rodiči mám protected delegát do kterého v potomkovské třídě přiřazuji jednu metodu. K volání delegátu dojde, k volání přidané metody však nikoliv. Jedná se o normální chování? Musím si vytvořit nový delegát?

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

To Xelenderus : Nevím, ukaž kód.

Nahlásit jako SPAM
IP: 89.203.157.–
Dušan Janošík | web: djanosik.cz, @djanosik
Xelenderus
~ Anonymní uživatel
12 příspěvků
24. 4. 2011   #3
-
0
-

    class Otec

{
protected DispatcherTimer tikac;
protected EventHandler dTikTak;

public HodinovyStrojek(string cestaKSouboru, TimeSpan interval)
{
tikac = new DispatcherTimer(); //Vytvoření časovače
Interval = interval; //Nastavení časovače na daný interval
dTikTak += /*new EventHandler*/((Object, EventArgs) => provedAkci1()); /
tikac.Tick += dTikTak;
}


}

class Syn : Otec
{
public IntervalovyHodinovyStrojek(string cestaKSouboru, TimeSpan interval)
: base(cestaKSouboru, interval)
{
dTikTak += ((Object, EventArgs) => this.akce2());
}



Při vytvoření objektu syn a vyvolání eventu se akce2 neprovede.

Nahlásit jako SPAM
IP: 92.62.224.–
Xelenderus
~ Anonymní uživatel
12 příspěvků
24. 4. 2011   #4
-
0
-

//Nehleďte na to, že tam nesedí názvy, je to jenom ukázkový příklad ořezaný o další zbytečné věci. Místo "IntervalovyHodinovyStrojeků" má být "Syn" a místo "HodinovyStrojek" "otec".
//Kód je původně kamarádovo

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

To Xelenderus : http://www.zive.cz/clanky/poznavame-c-a-microsoftnet-16-dil--udalosti/sc-3-a-123623/default.aspx

Nahlásit jako SPAM
IP: 82.99.180.–
Xelenderus
~ Anonymní uživatel
12 příspěvků
25. 4. 2011   #6
-
0
-

Ať to čtu jak to čtu, nevidím odpověď. Nikde tam není napsáno, že do delegátu nemohu přidat metodu z odvozené třídy.

Nahlásit jako SPAM
IP: 92.62.224.–
Xelenderus
~ Anonymní uživatel
12 příspěvků
25. 4. 2011   #7
-
0
-

Jednoduše řečeno, jaktože když přihlásím k odběru událostí delegát ke kterému později přihlásím další metodu, tak se ta daná metoda již nezavodá. Vždyď událost zavolá delegát a delegát by měl zavolat všechny právě přihlášené metody ne?

Nahlásit jako SPAM
IP: 92.62.224.–
Xelenderus
~ Anonymní uživatel
12 příspěvků
25. 4. 2011   #8
-
0
-

Tak už je to jasné, pokud do delegátu přidám něco po jeho přihlášení k eventu, tak je to ignorováno. Může mi, ale někdo prosím vysvětlit proč.

Nahlásit jako SPAM
IP: 92.62.224.–
Xelenderus
~ Anonymní uživatel
12 příspěvků
25. 4. 2011   #9
-
0
-

Omlouvám se za vydatnou dávku spamu, ale jsem zmaten čím dál tím více.
Tento kus kódu přihlašuje vyvolání eventu k delegátu:

dTikTak += eTikTak

A tento při zavolání delegátu zavolá event:
dTikTak += () => { eTikTak(); };

Může mi někdo jednoduše vysvětlit proč ten druhý akceptuje pozdní přidávání metod do eventu, zatímco ten první nikoliv?
//Pravděpodobně jsem jen šíleně natvrdlý, ale já to tu opravdu nevidím.

Nahlásit jako SPAM
IP: 92.62.224.–
25. 4. 2011   #10
-
0
-

Zdravím,

pokusím se to vysvětlit, ačkoliv si nejsem jistej, zda mám úplně správné informace. Oba řádky vypadají v podstatě stejně, ale jejich funkčnost je dost rozdílná (v tom nakonec tkví i nefunkčnost dříve uvedeného kódu).

tikac.Tick = dTikTak;
Tady se do události Tick přiřadí delegát, který v tuto chvíli odkazuje jen na metodu provedAkci1. Pokud vím, vytvoří se kopie tohoto delegáta a pozdější změna už na událost nemá vliv.

tikac.Tick = () => { dTikTak (); };
V tomto případě je situace malinko odlišná, protože se k události přiřazuje lambda výraz a požadovaný delegát se volá až v těle výrazu. Má tak vždy aktuální podobu a dojde ke spuštění i později přiřazených metod.

Snad je to trochu srozumitelný.

Nahlásit jako SPAM
IP: 89.203.157.–
Dušan Janošík | web: djanosik.cz, @djanosik
Petrroll0
Stálý člen
25. 4. 2011   #11
-
0
-

Chápu to podobně jako djanosik, ale osobně si mi trochu nasadil brouka do hlavy. Nikde to totiž není pořádně rozvedeno.

Nahlásit jako SPAM
IP: 92.62.224.–
Xelenderus
~ Anonymní uživatel
12 příspěvků
25. 4. 2011   #12
-
0
-

Díky moc, takhle by to opravdu dávalo smysl.

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, 16 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ý