明示的なインターフェイスの実装 (C# プログラミング ガイド)Explicit Interface Implementation (C# Programming Guide)

シグネチャが同じメンバーが含まれる 2 つのインターフェイスをあるクラスが実装する場合、そのクラスでそのメンバーを実装することで、実装としてそのメンバーが両方のインターフェイスで使用されます。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 = (IControl)sc;
        ISurface srfc = (ISurface)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

ただし、2 つのインターフェイス メンバーが同じ関数を実行しない場合、一方または両方のインターフェイスが間違って実装される可能性があります。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.PaintIControl インターフェイス経由でのみ利用できます。ISurface.PaintISurface 経由でのみ利用できます。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 = (IControl)obj;
c.Paint();  // Calls IControl.Paint on SampleClass.

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

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

2 つのインターフェイスで、それぞれが同じ名前の別のメンバー (プロパティやメソッドなど) を宣言するような場合の解決には、明示的な実装も利用されます。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

C# プログラミング ガイドC# Programming Guide
クラスと構造体Classes and Structs
インターフェイスInterfaces
継承Inheritance