かわろぐ

技術、ボルダリング、セキュリティ、その他もろもろ

MENU

C# interfaceの明示的実装ってなに?

そもそも interface って?

interface は直訳すると境界面で、メソッドの定義のみを書き、メソッドの実装をもたせることはできません。interface を実装する側では、抽象クラスにしないかぎり、 interface に定義されているメソッドをすべて実装しないとコンパイラに怒られてビルドが通りません。

interface の明示的実装

interface は1つのクラスで複数実装することが出来ます。つまり、同名のメソッドを持ったinterfaceを実装する可能性が十分にあるということです。で、下記に示す様なDoというメソッドを持った2つのinterfaceがあるとします。

interface IHoge
{
     string Do();
}

interface IFuga
{
     string Do();
}

この2つの interface を実装するクラス HogeFuga があります。ここでもちょっと見慣れない書き方が出てきて、どちらのDoメソッドの実装なのかわかる用に 戻り値の型 interface名.メソッド名(引数) という風に書きます。

class HogeFuga : IHoge, IFuga
{
     string IHoge.Do()
     {
          return "HogeDo!";
     }
     string IFuga.Do()
     {
          return "FugaDo!";
     }
}

このHogeFugaクラスで2つのDoを使い分けるには下記のように一旦使いたいDoのある方にキャストしてから使います。(なんかinterfaceにキャストするのは変な感じ。。。) キャストした後でないと、どちらのメソッドかわから無いので Visual Studio や LINQPad のインテリセンスにメソッドが表示されません。

var hogeFuga = new HogeFuga();
var hoge = (IHoge) hogeFuga;
var fuga = (IFuga) hogeFuga;
Console.WriteLine(hoge.Do());
Console.WriteLine(fuga.Do());

実行結果はこんな感じ。

f:id:kawa_xxx:20160310234601p:plain

何につかうの?

この辺に詳しく書かれていますが、主に消したいけど消せないメソッドを隠すときなどに使われるようです。

この記事のコード全体

この記事で使ったサンプル全体のコードは以下にあります。

参考文献