A megvalósítandó feladat a következő: készítsünk egy osztályt, melyben van egy függvény, amely elvégzi két paraméterként kapott szám összeadását. Ha az eredmény nagyobb lenne száznál, akkor jöjjön létre egy esemény, melyet felhasználhatunk.
Készítünk tehát egy Class1 nevű osztályt, melyben létrehozunk egy Add nevű függvényt és egy BinNumber nevű eseményt.
Az esemény létrehozásához szükségünk lesz egy ún. delegate-re, melyet tekinthetünk egy olyan speciális függvénynek, amely leírja, hogy milyen típusú az eseményünk kezelője. Jelen esetben két paramétert használunk: az elsőben az adott osztályt adjuk majd vissza, míg a második paraméter az Add függvény által összeadott két szám eredményét fogja tárolni.
public delegate void BigNumberEvent(object sender, int number);
A BigNumberEvent delegate felhasználható tehát egy esemény létrehozásához, illetve megtudható belőle, hogy milyen típusú eseménykezelőt kell majd létrehoznunk.
Ezek után jöhet az esemény elkészítése, melynél az event kulcsszóval jelezhetjük, hogy mit is szeretnénk.
public event BigNumberEvent BigNumber;
Nem kötelező, de szokás egy olyan függvény létrehozása, mely aktivizálja az eseményt. E függvény létrehozása leginkább akkor célszerű, ha az eseményünk aktivizálása az osztályon belül több helyről is szükségessé válhat. Jelen példánknál maradva, csupán egy helyen lesz erre szükségünk, de azért készítsük csak el a függvényt, melynek az OnBigNumber nevet adjuk.
A függvényben először ellenőriznünk kell, hogy a BigNumber eseményhez lett-e már eseménykezelő függvény rendelve. Ha igen, akkor ezt a függvényt meg kell hívnunk átadva a szükséges paramétereket. Az első paraméter a saját objektumunk lesz, míg a második az OnBigNumber paramétereként kapott szám, mely az Add függvény által számított összeget fogja tartalmazni.
protected virtual void OnBigNumber(int number)
{
if (BigNumber!=null)
{
BigNumber(this, number);
}
}
Nézzük mi is történik az Add függvényben. Összeadjuk a paraméterként kapott két számot, majd egy feltétellel ellenőrizzük, hogy ez nagyobb-e száznál. Ha igen, akkor az OnBigNumber függvény hívásával aktivizáljuk a BigNumber eseményt. Végezetül a függvény visszaadja a számított összeget.
public int Add(int a, int b)
{
int c = a + b;
if (c>100)
{
OnBigNumber(c);
}
return c;
}
Ezzel az osztályunk el is készült, nézzük most a felhasználását. Először is kell egy függvény, mely kezeli majd az osztály BigNumber eseményét. Ehhez készítünk egy BigNumberEventHandler nevű függvényt, melynek paraméter listája egyezik a delegate-nél megadottakkal. A függvényünk megjelenít majd egy üzenetet, melyben figyelmeztet, hogy a megadott két szám összege nagyobb száznál.
public void BigNumberEventHandler(object sender, int number)
{
label4.Text = "Az összeg nagyobb 100-nál! (" + number.ToString()+")";
}
Hozzunk most létre egy példányt ebből az osztályból és rendeljük a BigNumber eseményéhez a BigNumberEventHandler nevű függvényt, melyet úgy tehetünk meg, hogy létrehozunk egy új példányt a delegate-ből, amelynek konstruktorában kell megadnunk az eseményhez rendelendő függvényünket.
c = new Class1();
c.BigNumber += new BigNumberEvent(BigNumberEventHandler);
Ezek után nem maradt más hátra, mint az Add függvényt hívogatnunk. Ha a paramétereiben olyan számokat adunk meg, melyek összege nagyobb száznál, akkor meghívásra kerül a BigNumberEventHandler függvényünk és így lefut az ott elhelyezett kód is.
private void button1_Click(object sender, System.EventArgs e)
{
label1.Text = c.Add(Convert.ToInt32(textBox1.Text), Convert.ToInt32(textBox2.Text)).ToString();
}
Ezzel a módszerrel tetszőleges típusú eseményt létrehozhatunk és felhasználhatunk saját osztályainkban.