Явная реализация интерфейса (Руководство по программированию в C#)Explicit Interface Implementation (C# Programming Guide)

Если класс реализует два интерфейса, содержащих член с одинаковой сигнатурой, при реализации такого члена в классе оба интерфейса будут использовать этот член в качестве собственной реализации.If a class implements two interfaces that contain a member with the same signature, then implementing that member on the class will cause both interfaces to use that member as their implementation. В следующем примере все вызовы Paint приводят к вызову одного и того же метода.In the following example, all the calls to Paint invoke the same method.

class Test 
{
    static void Main()
    {
        SampleClass sc = new SampleClass();
        IControl ctrl = sc;
        ISurface srfc = sc;

        // The following lines all call the same method.
        sc.Paint();
        ctrl.Paint();
        srfc.Paint();
    }
}


interface IControl
{
    void Paint();
}
interface ISurface
{
    void Paint();
}
class SampleClass : IControl, ISurface
{
    // Both ISurface.Paint and IControl.Paint call this method. 
    public void Paint()
    {
        Console.WriteLine("Paint method in SampleClass");
    }
}

// Output:
// Paint method in SampleClass
// Paint method in SampleClass
// Paint method in SampleClass

Если два члена интерфейса выполняют разные функции, это может привести к некорректной реализации одного или обоих интерфейсов.If the two interface members do not perform the same function, however, this can lead to an incorrect implementation of one or both of the interfaces. Член интерфейса можно реализовать явно, создав член класса, который вызывается только через этот интерфейс и относится только к нему.It is possible to implement an interface member explicitly—creating a class member that is only called through the interface, and is specific to that interface. Для этого в имени члена класса указывается имя интерфейса, после которого следует точка.This is accomplished by naming the class member with the name of the interface and a period. Например:For example:

public class SampleClass : IControl, ISurface
{
    void IControl.Paint()
    {
        System.Console.WriteLine("IControl.Paint");
    }
    void ISurface.Paint()
    {
        System.Console.WriteLine("ISurface.Paint");
    }
}

Член класса IControl.Paint доступен только через интерфейс IControl, а ISurface.Paint — только через интерфейс ISurface.The class member IControl.Paint is only available through the IControl interface, and ISurface.Paint is only available through ISurface. Обе реализации метода будут разделены, и ни одна из них не будет доступна в классе напрямую.Both method implementations are separate, and neither is available directly on the class. Например:For example:

// Call the Paint methods from Main.

SampleClass obj = new SampleClass();
//obj.Paint();  // Compiler error.

IControl c = obj;
c.Paint();  // Calls IControl.Paint on SampleClass.

ISurface s = obj;
s.Paint(); // Calls ISurface.Paint on SampleClass.

// Output:
// IControl.Paint
// ISurface.Paint

Явная реализация также применяется в случаях, когда в каждом из двух интерфейсов объявляются разные члены (например, свойство и метод) с одинаковыми именами:Explicit implementation is also used to resolve cases where two interfaces each declare different members of the same name such as a property and a method:

interface ILeft
{
    int P { get;}
}
interface IRight
{
    int P();
}

Чтобы реализовать оба интерфейса и избежать ошибок компилятора, класс должен использовать явную реализацию либо свойства P, либо метода P, либо одновременно обоих этих членов.To implement both interfaces, a class has to use explicit implementation either for the property P, or the method P, or both, to avoid a compiler error. Например:For example:

class Middle : ILeft, IRight
{
    public int P() { return 0; }
    int ILeft.P { get { return 0; } }
}

См. такжеSee also