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?
Fórum › .NET
Přidání metody do delegátu rodiče
To Xelenderus : Nevím, ukaž kód.
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.
//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
To Xelenderus : http://www.zive.cz/clanky/poznavame-c-a-microsoftnet-16-dil--udalosti/sc-3-a-123623/default.aspx
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.
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?
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č.
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.
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ý.
Díky moc, takhle by to opravdu dávalo smysl.
Přidej příspěvek
Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku
×Vložení zdrojáku
×Vložení obrázku
×Vložení videa
Uživatelé prohlížející si toto vlákno
Podobná vlákna
Přidání metody do web service — založil Jan Grygerek
Přidání metody do existující třídy — založil rimi
Velikost obrázku dle rodiče — založil richard.zavodny
C# předání MDI rodiče do třídy ? — založil Lukáš
Moderátoři diskuze