読者です 読者をやめる 読者になる 読者になる

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

C# .NET Memo

C#ではインターフェイスメンバを明示的に実装することで、複数のインターフェイスに同じシグネチャのメソッドがあった場合に個別に実装することができる。

using System;

interface IHoge
{
    void Method();
}

interface IPiyo
{
    void Method();
}

class HogePiyo : IHoge, IPiyo
{
    public void Method()
    {
        Console.WriteLine("Hoge");
    }

    // 明示的なインターフェイスの実装
    void IPiyo.Method()
    {
        Console.WriteLine("Piyo");
    }
}

class Program
{
    static void Main(string[] args)
    {
        HogePiyo hp = new HogePiyo();
        hp.Method();

        IHoge ih = hp;
        ih.Method();

        IPiyo ip = hp;
        ip.Method();
    }
}

このように、インターフェイス名.メソッド名とすることで明示的にインターフェイスメンバを実装できる。ここで、IPiyoインターフェイスのMethodメソッドの実装ではアクセス修飾子はおろか、virtual、override、newも使用することが出来ない*1
このプログラムは実行すると


Hoge
Hoge
Piyo

と表示される。つまり、明示的にインターフェイスメンバを実装すると、インターフェイスを通してしかそのメソッドにアクセスできなくなる。
これを利用して、

class IHoge
{
    void Method();
}

class Hoge : IHoge
{
    void IHoge.Method()
    {
        ....
    }
}

のようにメソッドが重複していない場合に使用することで、インターフェイスメンバの公開を制御できる。

*1:abstractは当たり前として