Neste artigo vou revisitar o conceito de Delegate na linguagem VB .NET. |
Vamos continuar tratando agora de Delegates e argumentos.
Delegates e argumentos
Se você deseja associar um procedimento que leva argumentos a um delegado, ao declarar o delegado, forneça o(s) argumento(s) necessário(s) em seus parênteses.
Aqui está um exemplo de um delegado que leva dois argumentos (e retorna um valor):
Module Teste Delegate Function Multiplicar(ByVal valor As Double) As Double End Module |
Ao definir o procedimento associado, além de retornar o mesmo tipo de valor, verifique se o procedimento leva o mesmo número de argumentos.
Exemplo:
Module Exercicio Delegate Function Multiplicar(ByVal valor As Double) As Double Public Function AreaRetangulo(ByVal lado As Double) As Double
Return lado * lado
End Function
End Module |
Para associar o procedimento ao delegate, declare uma variável do tipo de delegado e acesse o nome do procedimento usando o operador AddressOf.
Module Exercicio Delegate Function Multiplicar(ByVal valor As Double) As Double Public Function Area(ByVal lado As Double) As Double Return lado * lado End Function Public Function Principal() As Integer
Dim AreaRetangulo As Multiplicar = New Multiplicar(AddressOf Area)
Return 0
End Function
End Module |
Portanto, para associar um método a um delegado, chame esse método na variável do delegado. A sintaxe do método Invoke() é:
Public Function Invoke(method As Delegate) As Object
A seguir veja um
exemplo de como usar esse método:
Module Module1
Delegate Sub MeuDelegado()
Delegate Function Multiplicar(ByVal valor As Double) As Double
Public Function Area(ByVal lado As Double) As Double
Return lado * lado
End Function
Public Function Volume(ByVal lado As Double) As Double
Return lado * lado * lado
End Function
Public Sub CalculoAreaVolume()
Dim lado As Double = 15.4
Dim AreaRetangulo As Multiplicar = New Multiplicar(AddressOf Area)
Dim VolumeCubo As Multiplicar = New Multiplicar(AddressOf Volume)
Console.WriteLine("Área = {0}", AreaRetangulo.Invoke(lado))
Console.WriteLine("Volume = {0}", VolumeCubo.Invoke(lado))
Console.ReadKey()
End Sub
Sub Main()
CalculoAreaVolume()
End Sub
End Module
|
Após definir o Delegate Multiplicar e as Function() Area e Volume(), criamos uma variável delegate e associamos ao delegate apontando para as functions Area e Volume usando o operador AdressOf.
A seguir usamos o método Invoke() para acessar o delegate passando o lado para calcular a área e o volume.
Passando um Delegate como um argumento
Usando delegados, um procedimento pode ser indiretamente passado como argumento para outro procedimento. Para isso, primeiro declare o delegado necessário.
Exemplo:
Module Module1
Delegate Function Potencia(ByVal valor As Double) As Double
End Module
|
Tal argumento seria usado como se fosse um procedimento em si. Isso significa que, quando acessado no corpo do procedimento, o nome do delegado deve ser acompanhado por parênteses e se o delegado tiver um argumento ou argumentos, o(s) argumento(s) deve(m) ser fornecido(s) entre os parênteses do delegado chamado.
Exemplo:
Module Module1
Private Raio As Double
Delegate Function Potencia(ByVal valor As Double) As Double
Public Function Area(ByVal pot As Potencia) As Double
Return pot(Raio) * Math.PI
End Function
End Module
|
Depois de declarar um delegado, lembre-se de definir um procedimento que
implementa o comportamento necessário desse delegado.
Quando o procedimento estiver pronto, para associá-lo a um delegado, declare
uma variável do tipo do delegado usando o operador New.
Nos parênteses do construtor, acesse o nome do procedimento associado usando
o operador AddressOf.
Para acessar o delegado, basta chamar o método Invoke().
Exemplo:
Module Module3
Delegate Function DelegateArea(ByVal valor As Double) As Double
Public Function Area(ByVal raio As Double) As Double
Return CalculaPotencia(raio) * Math.PI
End Function
Public Function CalculaPotencia(ByVal valor As Double) As Double
Return valor * valor
End Function
Public Sub CalculaAreaCirculo()
Dim raio As Double = 15.4
Dim AreaCirculo As DelegateArea = New DelegateArea(AddressOf Area)
Console.WriteLine("Cálculo Da Área do Círculo" & vbCrLf &
"Raio : " & vbTab & CStr(raio) & vbCrLf &
"Área : " & vbTab & CStr(AreaCirculo.Invoke(raio)))
Console.ReadKey()
End Sub
Sub main()
CalculaAreaCirculo()
End Sub
End Module
|
Dessa forma vimos a importãncia do conceito de delegates e como ele pode otimizar o nosso código.
"(Disse Jesus)Eu
sou a porta; se alguém entrar por mim, salvar-se-á, e entrará, e sairá, e
achará pastagens.
O ladrão não vem senão a roubar, a matar, e a destruir; eu vim para que
tenham vida, e a tenham com abundância."
João 10:9,10
Veja os
Destaques e novidades do SUPER DVD Visual Basic (sempre atualizado) : clique
e confira !
Quer migrar para o VB .NET ?
Quer aprender C# ??
Quer aprender os conceitos da Programação Orientada a objetos ? Quer aprender o gerar relatórios com o ReportViewer no VS 2013 ? Quer aprender a criar aplicações Web Dinâmicas usando a ASP .NET MVC 5 ? |
Gostou ? Compartilhe no Facebook Compartilhe no Twitter
Referências:
Super DVD Vídeo Aulas - Vídeo Aula sobre VB .NET, ASP .NET e C#
Visual Studio - Dica de produtividade - Quick Launch - Macoratti.net
Visual Studio - Dica de produtividade - Nuget - Macoratti.net