C# - Interfaces : implementação explícita


 Hoje vamos abordar um conceito básico da linguagem C# : A implementação explícita das interfaces.

Na linguagem C#, as interfaces podem ser implementadas implícita ou explicitamente. Este recurso esta presente deste as primeiras versões do C#.

Nas implementações implícitas (o padrão), os membros da interface são públicos na classe, e, nas implementações explícitas, os membros da interface não são declarados como membros públicos na classe e não podem ser acessados diretamente usando uma instância da classe; isso somente será possível fazendo uma conversão forçadas(cast) dos membros.

Assim, as declarações de interface explícitas significam que os membros da interface não estão disponíveis em tipos diferentes da própria interface, e, portanto, os tipos de implementação precisam ser convertidos para a interface antes de acessá-los publicamente.

Qual o motivo das implementações explícitas ?

O principal motivo é evitar conflitos de nomenclatura se acontecer de você implementar duas interfaces que possuam métodos com a mesma assinatura. A definição explícita permite que o compilador mantenha as assinaturas distintas o suficiente para resolver.

Outro motivo seria ocultar os membros da interface de uma classe concreta.

Implementações implícitas

Nas implementações implícitas, declaramos um membro público na classe com a mesma assinatura do método, conforme definido na interface e o mesmo tipo de retorno. É assim que você normalmente implementa interfaces.

Implementações explícitas

Na implementação explícita a interface não é mais declarada pública na implementação, e o membro da interface é prefixado com o nome da interface:

Nesta implementação o membro da interface não pode ser usado diretamente. Será preciso fazer um cast para invocar o método ExibirAviso(), ou usar os operadores is e as ou passar a instância para um método que requeira um parâmetro ITeste.

Exemplo

Suponha duas interfaces IFigura e IForma que contenham um membro com a mesma assinatura:

1- IFigura

 

2- IForma

Se ambas as interfaces forem implementadas de forma implícita(o padrão), implementar esse membro na classe fará com que as duas interfaces usem tal membro como sua implementação :

A seguir temos o código que chama o método:

Aqui podemos ter um problema quando dois membros da interface não executam a mesma função, neste caso, ele leva a uma implementação incorreta de uma ou de ambas as interfaces.

Para contornar essa situação podemos usar a implementação explicita criando um membro da classe que é chamado apenas por meio da interface e é específico para essa interface.

Nomeie o membro da classe com o nome da interface e um ponto final.

Aplicando isso ao exemplo temos agora a implementação explícita:

E agora o membro da classe IFigura.Desenhar está disponível somente por meio da interface IFigura e IForma.Desenhar está disponível apenas por meio de IForma.

Ambas as implementações de método são separadas e nenhuma está disponível diretamente na classe.

 É um conceito básico mas importante que pode em certos cenários ser a luz no fim do túnel...

Referências:


José Carlos Macoratti