実験してみるのが手っ取り早いですね。
// interface05.cs using System; public interface IInterface1 { void Show(); } public interface IInterface2 { void Show(); } class MyClass : IInterface1, IInterface2 { public void Show() { Console.WriteLine("Showメソッドです"); } } class interface05 { public static void Main() { MyClass mc = new MyClass(); mc.Show(); } }IInterface1もIInterface2もメンバは全く同じシグニチャを持つメソッドです。
MyClassは、この2つのインターフェースを実装しています。
これをコンパイルしても、コンパイラは何も文句を言いません。
実行結果は次のようになります。
このように、インターフェース間で同じシグニチャを持つメンバが存在したとき、曖昧さをなくすために、明示的な実装(Explicit interface implementation)を行うことができます。メソッドの場合は
インターフェース名.メソッド名(パラメータリスト) {実装内容}インターフェースを明示的に実装すると、そのクラスの参照からはアクセスできなくなります。さらに、publicなどのアクセス修飾子をつけることができなくなります。
じゃあ、どうやってアクセスするの?
と、いうことになりますが、これはインターフェース参照変数を使います。 この変数に、実装したクラスの参照を代入することになります。
// interface06.cs using System; public interface IInterface1 { void Show(string s); } public interface IInterface2 { void Show(string s); } class MyClass : IInterface1, IInterface2 { void IInterface1.Show(string s) { Console.WriteLine(s + "です"); } void IInterface2.Show(string s) { Console.WriteLine(s + "だ"); } } class interface06 { public static void Main() { MyClass mc = new MyClass(); IInterface1 i1 = mc; i1.Show("テスト"); IInterface2 i2 = mc; i2.Show("テスト"); } }実行結果は次のようになります。
どのバージョンの実装が実行されるかは、どのインターフェースの型に実装クラスの 参照を代入したかによって決まります。
インターフェースの参照変数には、それを実装したクラスの参照を代入できることが
わかりました。実は、これはすでに暗黙のうちに第54章で行っていました。
public string ToString ( string format, IFormatProvider provider )DateTime構造体のToStringメソッドで、providerはIFormatProviderインターフェースの 参照変数です。したがって、これを実装したCultureInfoクラスの参照を代入できるのですね。
せっかく覚えた明示的実装ですが、なるべく避けてくださいとMSDNに書いてあります。 (セキュリティ面で問題有り)
Update 05/Oct/2006 By Y.Kumei