implementação de interface implícita versus explícita

Duplicar Possível:
C #: Interfaces – Implementação Implícita e Explícita

Alguém explicaria as diferenças entre esses dois animais e como usá-los? AFAIK, muitas classs pre.2.0 foram implementadas sem tipos genéricos, fazendo com que a última versão implementasse ambos os tipos de interfaces. É o único caso porque alguém precisaria usá-los?

Você também pode explicar em profundidade como usá-los?

obrigado

Há uma boa e bem detalhada postagem no blog sobre isso.

Basicamente, com implementação de interface implícita, você acessa os methods e propriedades da interface como se fossem parte da class. Com implementações de interface explícitas, você só pode acessá-las ao tratá-las como essa interface.

Em termos de quando você usaria uma sobre a outra, às vezes você tem que usar a implementação explícita da interface, pois você tem uma propriedade / método com a mesma assinatura da interface ou quer implementar duas interfaces com as mesmas assinaturas e ter diferentes implementações para as propriedades / methods correspondentes.

As regras abaixo são do blog de diretrizes de design de Brad Abrams.

  • Não use membros explícitos como limite de segurança. Eles podem ser chamados por qualquer cliente que converter uma instância na interface.
  • Use membros explícitos para ocultar detalhes de implementação
  • Use membros explícitos para aproximar implementações de interface privada.
  • Exponha uma maneira alternativa de acessar os membros explicitamente implementados que as subclasss podem replace. Use o mesmo nome de método, a menos que surja um conflito.

Também é mencionado nos comentários no blog de Brad que há o boxe envolvido ao usar a implementação explícita nos tipos de valor, portanto, fique atento ao custo de desempenho.

Em termos leigos, se uma class herdar de 2 ou mais interfaces e se as interfaces tiverem os mesmos nomes de método, a class não saberá qual método de interface está sendo implementado se você usar a implementação de interface implícita. Este é um dos cenários em que você implementaria explicitamente uma interface.

Implementação Implícita de Interface

public class MyClass : InterfaceOne, InterfaceTwo { public void InterfaceMethod() { Console.WriteLine("Which interface method is this?"); } } interface InterfaceOne { void InterfaceMethod(); } interface InterfaceTwo { void InterfaceMethod(); } 

Implementação Explícita de Interface

 public class MyClass : InterfaceOne, InterfaceTwo { void InterfaceOne.InterfaceMethod() { Console.WriteLine("Which interface method is this?"); } void InterfaceTwo.InterfaceMethod() { Console.WriteLine("Which interface method is this?"); } } interface InterfaceOne { void InterfaceMethod(); } interface InterfaceTwo { void InterfaceMethod(); } 

O link a seguir tem um excelente vídeo explicando este conceito
Implementação Explícita de Interface

Há mais uma maneira de ver isso, a partir da própria implementação do labirinto, aqui: http://blogs.msdn.com/cbrumme/archive/2003/05/03/51381.aspx .

Mas, resumindo, a implementação implícita oferece uma conversão do tipo is-a, a implementação explícita não estará acessível, a menos que o object seja explicitamente convertido para esse tipo de interface.