Definirea delegatilor in VB.NET

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