インターフェイス (interface)

インターフェイスとは純粋仮想関数だけの抽象クラスと同義であり、抽象メンバだけを持ちインスタンス化できません。

定義

インターフェイスのアクセス修飾子は既定でpublicであり、これを指定することはできません。

interface MyInterface
{
    void Foo();

    public    void M1(); // error CS0106: 修飾子 'public' がこの項目に対して有効ではありません。
    protected void M2(); // error CS0106: 修飾子 'protected' がこの項目に対して有効ではありません。
    private   void M3(); // error CS0106: 修飾子 'protected' がこの項目に対して有効ではありません。
}

実装

// error CS0535: 'MyClass' はインターフェイス メンバー 'MyInterface.Foo()' を実装しません。
class MyClass : MyInterface
{
}
// error CS0737: 'MyClass' は、インターフェイス メンバー 'MyInterface.Foo()' を実装していません。'MyClass.Foo()' は public ではないため、インターフェイス メンバーを実装できません。
class MyClass : MyInterface
{
    void Foo() { }
}
class MyClass : MyInterface
{
    public void Foo() { }
}

明示的なインターフェイスの実装

シグネチャが同じ (名前と引数が同じ) メンバを持つ複数のインターフェイスを実装するクラスは、「インターフェイス名.クラスメンバ」の書式でそれらを分けて実装できます。明示的なインターフェイスの実装 - C# プログラミング ガイド | Microsoft Docs

interface I1
{
    void Foo();
}

interface I2
{
    void Foo();
}


class C1 : I1, I2
{
    public void Foo() { } // I1.Foo() または I2.Foo()のいずれでも、このメソッドが呼ばれる
}

class C2 : I1, I2
{
    void I1.Foo() { } // I1.Foo()から、このメソッドが呼ばれる
    void I2.Foo() { } // I2.Foo()から、このメソッドが呼ばれる
    
// public void I1.Foo() { } // error CS0106: 修飾子 'public' がこの項目に対して有効ではありません。
// アクセス修飾子は省略する C# Multiple Interface Inheritance does not allow public access modifier with same name - Stack Overflow    
}

参考

参考書

MSDN (Microsoft Developer Network) から検索