C# - Delegates e/ou Interfaces
Hoje vamos fazer uma comparação entre Delegates e interfaces e ver que conclusão chegamos. |
Seriam os delegates, em muitos aspectos, iguais à interfaces de método único ?
Poderiamos usar indistintamente delegates ou interfaces de forma intercambiável ?
Vejamos...
Se pensarmos um pouco sobre a definição de cada um veremos que os delegates e interfaces permitem separar as declarações e implementações do tipo.
Um Delegate
é um objeto que se refere a um método ou você pode dizer que é uma
variável do tipo de referência que pode conter uma referência aos
métodos. Uma Interface pode ter métodos, propriedades, eventos e indexadores como seus membros. Mas as interfaces conterão apenas a declaração dos membros. A implementação dos membros da interface será dada pela classe que implementa a interface implícita ou explicitamente. |
Assim, uma interface pode ser herdada e implementada por qualquer classe ou estrutura, e, um delegate pode ser criado para um método em qualquer classe, desde que o método se ajuste à assinatura do método para o delegate.
Da mesma forma uma referência de interface ou de um delegate pode ser usada por um objeto que não tem conhecimento da classe que implementa a interface ou o método de delegação.
Dadas essas semelhanças, quando um podemos usar um delegate e quando podemos usar uma interface ?
Primeiro vamos montar uma tabela com as diferenças entre Delegates e Interfaces para nos ajudar a visualizar melhor o problema:
Delegate | Interface |
Pode ser somente um método | Contém métodos e propriedades. |
Pode ser aplicado a um método por vez | Se uma classe implementa uma interface, implementará todos os métodos relacionados a essa interface. |
Se um delegado estiver disponível no seu escopo, você poderá usá-lo. | É usada quando sua classe implementa essa interface, caso contrário não. |
Os delegados podem ser implementados várias vezes. | A interface pode ser implementada apenas uma vez. |
É usado para manipular eventos. | Não é usado para manipular eventos. |
Pode acessar métodos anônimos. | Não pode acessar métodos anônimos. |
Ao acessar o método usando delegates, você não precisa de nenhum acesso ao objeto da classe em que o método está definido. | Ao acessar o método, você precisa do objeto da classe que implementou uma interface. |
Não suporta herança. | Suporta a herança |
Pode envolver métodos estáticos e métodos de classe sealed | Não envolve métodos estáticos e métodos de classe sealed |
É criado em tempo de execução | Criada em tempo de compilação |
Pode implementar qualquer método que forneça a mesma assinatura com o delegate especificado. | Se o método da interface foi implementado, um método com mesmo nome e assinatura ele sobrescreve o método. |
Pode agrupar qualquer método cuja assinatura seja semelhante ao delegate e não considera de qual classe pertence. | Uma classe pode implementar qualquer número de interfaces, mas pode substituir apenas os métodos que pertencem às interfaces. |
Agora podemos ter uma idéia mais precisa de quando podemos usar ou não um delegate e/ou interface.
Assim, seria mais conveniente usar um delegate quando :
Para complementar podemos usar interfaces quando :
Dessa forma os delegates e interfaces são dois conceitos distintos na linguagem C# que compartilham semelhanças, sendo que existe suporte embutidos para ambos na CLR e no .NET Framework incluindo a invocação assíncrona.
E estamos conversados.
"Quem ama a
sua vida perdê-la-á, e quem neste mundo odeia a sua vida, guardá-la-á para a
vida eterna.
Se alguém me serve, siga-me, e onde eu estiver, ali estará também o meu servo.
E, se alguém me servir, meu Pai o honrará."
João 12:25,26
Referências:
Super DVD Vídeo Aulas - Vídeo Aula sobre VB .NET, ASP .NET e C#
C# - StreamReader, StringReader e TextReader . Qual a ... - Macoratti
C# - Imprimindo um arquivo texto - Macoratti
C# - Usando OpenFileDialog - Macoratti
C# - Formatando arquivos textos - Macoratti
C# - Convertendo valores para o formato monetário
C# - Lendo e escrevendo em arquivos textos e binários - Macoratti
VB.NET - Conversão entre tipos de variáveis - Macoratti
C# - Localizando Arquivos - Macoratti