Denis Bittencourt Muniz Postado Fevereiro 18, 2006 Denunciar Share Postado Fevereiro 18, 2006 Fala gente!O que é 'Delegate'?Falows! Link para o comentário Compartilhar em outros sites More sharing options...
0 Graymalkin Postado Fevereiro 19, 2006 Denunciar Share Postado Fevereiro 19, 2006 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? É 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 More sharing options...
0 Denis Bittencourt Muniz Postado Fevereiro 21, 2006 Autor Denunciar Share Postado Fevereiro 21, 2006 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 More sharing options...
0 Graymalkin Postado Fevereiro 21, 2006 Denunciar Share Postado Fevereiro 21, 2006 valeu Graymalkin! Entendi... Um parâmetro que pede uma função como argumento, função está com a mesma assinatura do protótipo...Exatamente. 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 More sharing options...
Pergunta
Denis Bittencourt Muniz
Fala gente!
O que é 'Delegate'?
Falows!
Link para o comentário
Compartilhar em outros sites
3 respostass a esta questão
Posts Recomendados