インターフェイスとは純粋仮想関数だけの抽象クラスと同義であり、抽象メンバだけを持ちインスタンス化できません。
インターフェイスのアクセス修飾子は既定で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
}