インターフェイス (interface)

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

定義

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

interface MyInterface
{
    void Method();

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

実装

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

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

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

interface I1
{
    void Method();
}

interface I2
{
    void Method();
}


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

class C2 : I1, I2
{
    void I1.Method() { } // I1.Method()から、このメソッドが呼ばれる
    void I2.Method() { } // I2.Method()から、このメソッドが呼ばれる

// public void I1.Method() { } // error CS0106: 修飾子 'public' がこの項目に対して有効ではありません。
// アクセス修飾子は省略する C# Multiple Interface Inheritance does not allow public access modifier with same name - Stack Overflow
}

参考

参考書

Microsoft Learnから検索