Ir para conteúdo
Fórum Script Brasil
  • 0

Delegates


Denis Bittencourt Muniz

Pergunta

3 respostass a esta questão

Posts Recomendados

  • 0

O que é 'Delegate'?

Uma delegate é um meio de você criar um protótipo para uma função ou rotina que pode ser passada como um parâmetro. É uma delegação porque você estará passando a responsabilidade para a função que quiser. Se quiser depois eu posto um exemplo simples aqui.

Bom Graymalkin... gostaria de um exemplo sobre 'delegate'.

Imagine a seguinte classe:

    Public Class ExemploDelegate
        Public Delegate Function Calcular(ByVal x As Integer) As Integer

        Private _valor As Integer = 0

        Public ReadOnly Property Valor() As Integer
            Get
                Return _valor
            End Get
        End Property

        Public Sub New(ByVal c As Calcular, ByVal i As Integer)
            _valor = c.Invoke(i)
        End Sub
    End Class
A delegate aí no caso se chama "Calcular". Note que é somente a declaração da função. O que "Calcular" faz? O código acima não nos diz isso, mas a função é chamada no método construtor (c.Invoke(i) é a chamada). Temos a plena certeza de que "Calcular" recebe um inteiro e retorna um inteiro, mas não sabemos o que ela faz com o inteiro recebido e qual vai ser o inteiro retornado. Ou seja, a delegate permite que chamemos uma função que teoricamente não existe, mas que sabemos que irá existir. Se em outra classe qualquer, criarmos as seguintes funções...
    Public Function ElevarAoQuadrado(ByVal i As Integer) As Integer
        Return i ^ 2
    End Function

    Public Function ElevarAoCubo(ByVal i As Integer) As Integer
        Return i ^ 3
    End Function

    Public Function Incrementar(ByVal i As Integer) As Integer
        Return i + 1
    End Function

    Public Function Decrementar(ByVal i As Integer) As Integer
        Return i - 1
    End Function
... poderemos passá-las para a delegate de forma que a função que realmente vai ser chamada será uma delas. Note que todas as funções acima tem exatamente a mesma assinatura da delegate (recebe um inteiro e retorna um inteiro). Portanto, poderemos fazer o seguinte:
        Dim obj As ExemploDelegate

        obj = New ExemploDelegate(AddressOf ElevarAoQuadrado, 2)
        Debug.WriteLine(obj.Valor)

        obj = New ExemploDelegate(AddressOf ElevarAoCubo, 2)
        Debug.WriteLine(obj.Valor)

        obj = New ExemploDelegate(AddressOf Incrementar, 2)
        Debug.WriteLine(obj.Valor)

        obj = New ExemploDelegate(AddressOf Decrementar, 2)
        Debug.WriteLine(obj.Valor)

Estaremos criando objetos da classe ExemploDelegate passando para eles uma função e um valor (como pede o método construtor da classe). No caso da função, na verdade passamos o endereço dela (por isso o operador AddressOf). Dentro da classe, ao chamar um objeto do tipo da delegate, na verdade estaremos chamando a função que foi passada. Sacou? wink.gif É semelhante ao que existe em C++ sob o nome de "ponteiros para funções".

Abraços,

Graymalkin

Link para o comentário
Compartilhar em outros sites

  • 0

valeu Graymalkin! Entendi... Um parâmetro que pede uma função como argumento, função está com a mesma assinatura do protótipo... Outra: Quais outras aplicações seria interessante o uso de 'Delegate'?

Mais um favor: poderia reescrever o exemplo em C#?

Falows!

Link para o comentário
Compartilhar em outros sites

  • 0

valeu Graymalkin! Entendi... Um parâmetro que pede uma função como argumento, função está com a mesma assinatura do protótipo...

Exatamente. smile.gif

Outra: Quais outras aplicações seria interessante o uso de 'Delegate'?

No momento não me vem nada em mente, mas se eu pensar em alguma utilização interessante eu coloco aqui.

Mais um favor: poderia reescrever o exemplo em C#?

Claro. Aí vai a classe:

  public class ExemploDelegate 
  {
  	public delegate int Calcular(int x);

  	private int _valor = 0;

  	public int Valor 
  	{
    get { return _valor; }
  	}

  	public ExemploDelegate(Calcular c, int i) 
  	{
    _valor = c(i);
  	}
  }
As funções:
  public int ElevarAoQuadrado(int i) 
  {
  	return i*i;
  }

  public int ElevarAoCubo(int i) 
  {
  	return i*i*i;
  }

  public int Incrementar(int i) 
  {
  	return ++i;
  }

  public int Decrementar(int i) 
  {
  	return --i;
  }
E o exemplo de utilização:
  	ExemploDelegate obj;
  	
  	obj = new ExemploDelegate(new ExemploDelegate.Calcular(ElevarAoQuadrado), 2);
  	System.Console.WriteLine(obj.Valor.ToString());

  	obj = new ExemploDelegate(new ExemploDelegate.Calcular(ElevarAoCubo), 2);
  	System.Console.WriteLine(obj.Valor.ToString());

  	obj = new ExemploDelegate(new ExemploDelegate.Calcular(Incrementar), 2);
  	System.Console.WriteLine(obj.Valor.ToString());

  	obj = new ExemploDelegate(new ExemploDelegate.Calcular(Decrementar), 2);
  	System.Console.WriteLine(obj.Valor.ToString());

Abraços,

Graymalkin

Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novos posts.


  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,3k
×
×
  • Criar Novo...