VB .NET  -  O conceito de Delegate revisitado - II


 Neste artigo vou revisitar o conceito de Delegate na linguagem VB .NET.
 
Na primeira parte do artigo revisitei os conceitos básicos sobre 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


Para ajudar você a acessar um delegado, a classe Delegate está equipada com um método chamado Invoke.

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

 

Um delegado pode ser passado como argumento para um procedimento.

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:


José Carlos Macoratti