Implementação de Interface explícita (guia de programação de C#)
Se um classe implementa duas interfaces que contêm um membro com a mesma assinatura, e implementar esse membro da classe fará com que as duas interfaces usar esse membro como a sua implementação. Por exemplo:
interface IControl
{
void Paint();
}
interface ISurface
{
void Paint();
}
class SampleClass : IControl, ISurface
{
// Both ISurface.Paint and IControl.Paint call this method.
public void Paint()
{
}
}
Se os dois interface membros não executam a mesma função, no entanto, isso pode levar a uma implementação incorreta de uma ou ambas as interfaces. É possível implementar um membro da interface explicitamente — criar um membro da classe que é chamado somente por meio da interface e é específico para aquela interface. Isso é realizado pelo membro da classe com o nome da interface e um período de nomeação. Por exemplo:
public class SampleClass : IControl, ISurface
{
void IControl.Paint()
{
System.Console.WriteLine("IControl.Paint");
}
void ISurface.Paint()
{
System.Console.WriteLine("ISurface.Paint");
}
}
Membro da classe IControl.Paint somente está disponível através do IControl interface, e ISurface.Paint só está disponível por meio de ISurface. Ambas as implementações do método são separadas e nem está disponível diretamente na classe. Por exemplo:
SampleClass obj = new SampleClass();
//obj.Paint(); // Compiler error.
IControl c = (IControl)obj;
c.Paint(); // Calls IControl.Paint on SampleClass.
ISurface s = (ISurface)obj;
s.Paint(); // Calls ISurface.Paint on SampleClass.
Implementação explícita também é usada para resolver os casos onde duas interfaces declarar membros diferentes do mesmo nome, como uma propriedade e um método:
interface ILeft
{
int P { get;}
}
interface IRight
{
int P();
}
Para implementar ambas as interfaces, uma classe tem que usar uma implementação explícita para a propriedade p ou o método P, ou ambas, para evitar um erro do compilador. Por exemplo:
class Middle : ILeft, IRight
{
public int P() { return 0; }
int ILeft.P { get { return 0; } }
}
Consulte também
Referência
Classes e estruturas (guia de programação de C#)
Interfaces (C# Programming Guide)
Inheritance (C# Programming Guide)