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:


José Carlos Macoratti