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