Ce este un eveniment
Interfețele grafice actuale cer ca un anumit program să răspundă la evenimente. Un eveniment poate fi de exemplu apăsarea unui buton, terminarea transferului unui fișier, selectarea unui meniu, etc; pe scurt, se întâmplă ceva la care trebuie să se dea un răspuns.
Alte clase/ obiecte pot fi interesate să răspundă la aceste evenimente. Modul în care vor reacționa va fi diferit de la caz la caz, iar obiectul care semnalează evenimentul (ex: un obiect de tip buton, la apăsarea lui) nu trebuie să știe modul în care se va răspunde. Butonul va comunica faptul că a fost apăsat, iar clasele interesate în acest eveniment vor reacționa fiecare în mod specific.
Publicarea și subscrierea
În C#, orice obiect poate să publice un set de evenimente la care alte clase pot să subscrie. Când obiectul care a publicat evenimentul îl și semnalează, toate obiectele care au subscris la acest eveniment sunt notificate. În acest mod se definește o dependență de tip one–to–many între obiecte astfel încât dacă un obiect își schimbă starea, atunci toate celelalte obiecte dependente sunt notificate și modificate automat. De exemplu, un buton poate să notifice un număr oarecare de observatori atunci când a fost apăsat. Butonul va fi numit publicator (publisher) deoarece publică evenimentul Click iar celelalte clase sunt numite abonați (subscriber) deoarece ele subscriu la evenimentul Click.
Evenimente și delegați
Tratarea evenimentelor în C# se face folosind delegați. Clasa ce publică definește un delegat pe care clasele abonate trebuie să îl implementeze. Când evenimentul este declanșat, metodele claselor abonate vor fi apelate prin intermediul delegatului. Metodele care răspund la un eveniment se numesc event handlers. Declararea unui eveniment se face astfel:
event tip nume–eveniment
Descrierea exemplului
Clasa CeasDigital definește un eveniment cu numele tact asociat delegatului Timp. Metoda Declansator lansează la fiecare 3 secunde un apel către evenimentul tact, cu alte cuvinte face un apel la lista de subscripție a delegatului Timp.
Avem așadar 3 entități asociate care funcționează legat:
- un delegat (Timp, care are tipul void și nu are parametri)
- un eveniment (tact, asociat delegatului Timp)
- o metodă de gestionare a producerii evenimentelor de tip tact (Declanșator).
În continuare apar clasele care subscriu la acest eveniment. Ele sunt clasele Cartier și Rolex. Fiecare din ele definește metoda proprie de tratare a evenimentului, metodă numită handler sau event-handler. Handlerele trebuie să fie compatibile cu delegatul Timp, respectiv să returneze tipul void și să nu aibă parametri.
În programul principal se instanțiază câte un obiect din fiecare clasă, se face subscrierea handlerelor la lista evenimentului și se lansează în execuție threadul - respectiv rutina care declanșează evenimentele.
namespace Evenimente
{
public delegate void Timp(); //declarare tip delegat
//declararea clasei publisher
public class CeasDigital
{
public event Timp tact; //declarare eveniment de tipul Timp cu numele tact
public void Declansator() //cod care produce/declanseza evenimentele
{
while (true)
{
//executia programului se suspenda 3 secunde
System.Threading.Thread.Sleep(3000);
//verificam daca exista metode subscrise in lista evenimentului
if (tact != null)
tact();
}
}
}
//clase abonati
class Rolex
{
public void HanlerRolex()
{
Console.WriteLine("Ceasul Rolex, notificat la {0}", DateTime.Now);
}
}
class Cartier
{
public void HandlerCartier()
{
Console.WriteLine("ceasul Cartier, notificat la {0}", DateTime.Now);
}
}
class Program
{
static void Main(string[] args)
{
CeasDigital cd = new CeasDigital();
Rolex r = new Rolex();
Cartier c = new Cartier();
// subscrierea claselor Rolex si Cartier la eveniment
cd.tact += c.HandlerCartier;
cd.tact += r.HanlerRolex;
//declanseaza procesul
cd.Declansator();
}
}
}
Niciun comentariu:
Trimiteți un comentariu