Um delegate pode ser definido como um ponteiro para uma função. O delegate encapsula o endereço de uma função no seu código.
As funções associadas a eventos são um exemplo da utilização de delegates, quando o evento “acontece” é chamada a função para a qual o delegate aponta.
Os delegates podem agrupar funções que são chamadas em conjunto.
Para utilizarmos delegates começamos por definir um:
Private Delegate Sub MinhaFuncao()
Agora vamos criar a função que será associada ao delegate:
Private SubEscreveDebug()
Debug.Print("Olá mundo")
End Sub
De seguida criamos uma variável do tupo do delegate e associamos à função:
Dim funcDel As MinhaFuncao
Depois associamos a variável à respectiva função:
funcDel = New MinhaFuncao(AddressOf EscreveDebug)Por fim executamos a função através do delegate:
funcDel.Invoke()
Delegates Multicast
Os delegates multicast permitem criar uma sequência de funções a serem chamadas quando o delegate é invocado.
De momento não é possível definir a ordem em que são executadas somente que estas são executadas.
Para começar definimos mais uma função:
Private SubEscreveDebug2()
Debug.Print("Olá mundo, outra vez")
End Sub
De seguida criamos outra variável para associar a esta função:
Dim funcDel2 As MinhaFuncao
Associamos:
funcDel2 = New MinhaFuncao(AddressOfEscreveDebug2)
Agora criamos um delegate multicast que vai invocar os outros dois:
Dim funcDelTodas As [Delegate]
Para isso temos de associar este aos outros dois:
funcDelTodas = MulticastDelegate.Combine(funcDel, funcDel2)
Por fim, executamos:
funcDelTodas.DynamicInvoke(Nothing)
Com os delegates podemos criar diferentes versões de uma função e associar ao delegate a versão que pretendemos utilizar de acordo com o desenvolvimento da aplicação.
Os delegates também permitem passar uma função para outra como um parâmetro.
Por exemplo podemos ter uma função chamada operador que invoca um delegate passado por parâmetro a dois valores para executar uma operação.
Declaração da função delegate:
Public Delegate Function Operador(ByVal x As Double, ByVal y As Double) As Double
Assim podemos definir a seguinte operação:
FunctionSoma(ByVal x AsDouble, ByVal y As Double) As Double
Return x + y
End Function
E ainda outra assim:
FunctionSubtrai(ByVal x AsDouble, ByVal y As Double) As Double
Returnx - y
End Function
Agora podemos criar a função calcular que recebe o delegate a chamar bem como os parâmetros a passar ao delegate:
FunctionCalcular(ByVal op AsOperador, ByValx As Double, ByVal y As Double) As Double
Dim devolver As Double
devolver = op.Invoke(x, y) 'invoca a função associada
Return devolver
End Function
Para testar este conceito criamos um formulário assim:
Agora podemos chamar a função calcular a partir do clique no botão:
Dim x, y As Integer
x = Me.TextBox1.Text
y = Me.TextBox2.Text
Me.Label3.Text = Calcular(AddressOf Soma, x, y)
Me.Label4.Text = Calcular(AddressOf Subtrai, x, y)
Comentários
Enviar um comentário