インターフェイス

C#のインターフェイスはJavaのインターフェイスと基本的には同じだが、異なる部分もある。


まず、C#のインターフェイスには定数が記述できない。更に、ネストした型を宣言することも出来ない。
前者は許せるのだが、後者は慣れが必要そうだ。まぁC#にはinternalがあるから、ネストさせるよりinternalにしろ、ということなのかもしれない。


また、publicやabstract、virtualといったものも使用できない*1


インターフェイスに記述できるものとして、メソッドのほかにプロパティやインデクサ*2も記述できる。


インターフェイスは、既存のインターフェイスから拡張させたり、複数の既存のインターフェイスを結合させたりできる。拡張と結合の違いは、インターフェイスが単体(拡張)か複数(結合)かだけなので、どちらも拡張でいいじゃんとか思ったり思わなかったり。
インターフェイスを拡張、結合する際は

interface IHoge {}
interface IExHoge : IHoge {}

のように記述する。


インターフェイスを実装するには、

interface IHoge
{
    void Method();
}

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

のように記述する。ここでHogeクラスのMethodメソッドにvirtualを付けるとHogeクラスを継承した際、このメソッドがオーバーライドできるが、付けないと隠蔽となる。
インターフェイスを通してメソッドを呼び出す際、

IHoge h = new Hoge();
h.Method();

のように記述する。

*1:newは使用できる。overrideはもちろん不可

*2:C++でのoperator[]