Diskuze: C# události
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.
Zobrazeno 4 zpráv z 4.
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.
Používají se dost, ale základy bys měl zvládat i bez toho, že bys události chápal. Pokud ti můžu poradit, běž dál a vrať se k nim až když je budeš aspoň měsíc používat (tj. budeš si vědom, jak a kde se používají), pak by to pro tebe neměl být problém.
Každé ťuknutí na čudlík, pohyb oknem apod. je událost. Takže se používají VELMI hojně. Ale tobě jde spíše o uživatelsky definované události, že. Princip je tento: Obsluha události je funkce, která se má vykonat, když událost nastane. Odkaz na tuhle funkci musíš nějak dostat tam, kde se má událost obsloužit. To se dá dělat různě, nejobvyklejší je to přes delegáta. Nevím, jestli víš, o co se jedná, pokud ne, představ si to jako pointer na funkci. Tu funkci, která zajišťuje obsluhu události. Samotná událost může být v podstatě cokoli tě napadne, třeba ztráta spojení s databází, nějaká nečekaná situace při zpracování dat, smrt postavy ve hře,apod. Základní syntaxe je tato:
public delegate void delegOnSmrt(object sender); ---> tím deklaruješ schéma funkce, která bude tvořit obsluhu události. Konkrétní obsluha bude za chvíli.
class Postava ---> to bude objekt, u kterého budeme vyvolávat událost(i)
{
public event delegOnSmrt OnSmrt; ---> tímhle řekneš třídě, že bude mít k dispozici funkci OnSmrt a bude mít schéma delegOnSmrt, tj. bude vyžadovat při volání jako parametr nějaký object.
.....
if (Zdravi == 0)
{
if (OnSmrt != null) ---> je třeba se ujistit, že ta funkce je skutečně k dispozici
OnSmrt(this) ---> a v tom případě ji zavoláme a jako parametr předáme něco typu object, typicky pointer na u třídu, která událost vyvolala. Velmi užitečné, viz za chvíli.
}
......
No a v hlavním programu, který zajišťuje celou logiku, by se mělo objevit toto:
drak = new Postava();
drak.OnSmrt += ObsluhaSmrtiPostavy; tím řekneme, že v případě události OnSmrt objektu drak se má provést funkce "ObsluhaSmrtiPostavy"
....
Honza = new Postava();
Honza.OnSmrt += ObsluhaSmrtiPostavy; tím řekneme, že v případě události OnSmrt objektu Honza se má provést tatáž funkce "ObsluhaSmrtiPostavy"
....
V obou případech se volá tatáž funkce ObsluhaSmrtiPostavy, takže v zásadě nelze rozlišit, která postava to vlastně špatně dopadla. Proto je tu parametr sender, ve kterém je zapsáno, kdo tu událost vyvolal a lze tak událost korektně obsloužit.
void ObsluhaSmrtiPostavy(object sender) ---> a tohle je ta funkce, která se má vykonat
{
if (sender == drak)
{
(drak prohrál) takže tady naprogramujeme oslavnou fanfáru
}
if (sender == Honza)
{
(Honza prohrál) a tady naprogramujeme, co se má stát, když drak vyhraje
}
}
Teď je otázka, proč to dělat takhle. Velmi podobně je napsaný i .NET framework, například u třídy Button je napsáno, že vyvolává událost OnClick, ale samotná obsluha (tj. co se má stát po kliknutí) se už píše v tvém programu. Vše ostatní (optický efekt apod.) je napsané ve střevech .NET frameworku, na programátorovi zbyde jen obsluha.
Moc děkuji za vysvětlení. Konečně sem ty události pochopil vysvětlil jste mi to lépe než
tutorial co je zde na webu.
Moc díky!
Edit:
jinak delegáty chápu.
Zobrazeno 4 zpráv z 4.