Delegatul este un pointer care permite apelul unei functii in mod indirect prin intermediul adresei de memorie a acesteia. Delegatul este utilizat pentru a apela metode ale altor obiecte. Este similar pointerului de functie utilizat in alte limbaje de programare. Diferenta consta in faptul ca delegatul este un tip referinta pe baza clasei System.Delegate.
Delegatii sunt folositori in situatiile in care aparitia unui eveniment determina apelul de handler-i de eveniment diferiti, in functie de contextul aparitiei evenimentului. Acest lucru impune asocierea dinamica a evenimentelor cu handler-ii de evenimente, fiind utilizati delegatii in acest scop.
Declararea unui eveniment cu specificatia Event determina definirea unei clase delegat implicita denumita EventHandler in interiorul clasei in care este definit evenimentul.
Specificatia AddressOf creeaza o instanta de delegat implicita.
AddHandler ObEveniment.UnEveniment, _
New EventHandler(AddressOf ObEveniment_HandlerEveniment)Un eveniment poate fi declarat utilizand un tip de delegat creat anterior.
Delegat Sub TipDelegat() Event EvenimentDoi As TipDelegat
Acest lucru permite asocierea mai multor evenimente cu acelasi handler de eveniment.
Delegatii mai pot fi utilizati pentru apelul de diverse versiuni de subrutine, in functie de contextul executiei aplicatiei.
Invocarea metodei delegat presupune:
- crearea delegatului;
- declararea clasei care contine metoda cu aceeasi semnatura cu delegatul (lista de parametri);
- crearea instantei delegat si invocarea metodei asociata cu delegatul prin apelul metodei standard Invoke.
Exemplul de mai jos evidentiaza mecanisme de definire si utilizare a delegatilor. Tipul de aplicatie selectat la definirea proiectului este Console Application.
'crearea unui delegat Delegate Sub DelOpAritmetica(ByVal x As Integer, ByVal y As Integer) 'crearea primei clase de obiecte care contine 'o metoda cu aceeasi semnatura ca a delegatului Class GrupOp1 Sub OpDiferenta(ByVal a As Integer, ByVal b As Integer) Dim dif As Integer dif = a - b MsgBox("Diferenta este: " & CStr(dif)) End Sub End Class 'crearea celei de a doua clase de obiecte care contine 'o metoda cu aceeasi semnatura ca a delegatului Class GrupOp2 Sub OpInmultire(ByVal a As Integer, ByVal b As Integer) Dim prod As Integer prod = a * b MsgBox("Inmultirea este: " & CStr(prod)) End Sub End Class Sub Main() 'definirea unei variabile obiect de tipul GrupOp1 Dim op1 As New GrupOp1 'definirea unei variabile obiect de tipul GrupOp2 Dim op2 As New GrupOp2 'crearea unei instante a delegatului Dim del As DelOpAritmetica 'initiliazarea instantei delegatului cu adresa 'metodei OpDiferenta definita in clasa GrupOp1 del = AddressOf op1.OpDiferenta 'invocarea metodei OpDiferenta prin delegat del.Invoke(10, 3) 'initializarea instantei delegatului cu adresa 'metodei OpInmultire definita in clasa GrupOp2 del = AddressOf op2.OpInmultire 'invocarea metodei OpInmultire prin delegat del.Invoke(9, 3) End Sub

in romanian
in english