クラスにインターフェースの宣言を追加すると、VisualStudioのインテリセンスでは以下の2種類の実装方法が提示されます。
① インターフェース'xxx'を実装します
② インターフェース'xxx'を明示的に実装します
一見同じに見えますが、実は違うんですよね。 私も最近までわからずに使っていました。
なので、ちょっとメモ。
まずはインターフェースの宣言です。
interface ITestable
{
void Test();
}
で、インターフェースの宣言をクラスに追加して、
①の方を選択するとVSではこんな感じになりますね。
class TestA : ITestable
{
#region IBarkable メンバ
public void Test()
{
Console.Out.WriteLine("TestA");
}
#endregion
}
②を選ぶとこんな感じのソースになります。
class TestB : ITestable
{
#region ITestable メンバ
void ITestable.Test()
{
Console.Out.WriteLine("TestB");
}
#endregion
}
で、これらは使う時に差が出てきます。
例1.
TestA t1 = new TestA();
t1.Test(); // OK
↑ これはOKです。
例2.
TestB t2 = new TestB();
//t2.Test(); // NG
↑ これはNGです。 明示的な実装ではインターフェースとして
明示しないと動いてくれません。(コンパイルも通りません)
なので、正解はこっちです。↓
ITestable t3 = t2 as TestB;
t3.Test(); // OK
奥が深いですね。
どんな時に使い分けるかは...。
うーん。 どなたか、良い例お願いします。
[さんの情報を元に追加しました。2008/06/04 11:41]
http://msdn.microsoft.com/ja-jp/library/ms229034.aspxより
明示的な実装のガイドラインを見出しだけ引用
・ 積極的な理由がない場合は、インターフェイス メンバの明示的な実装を避けます。
・ インターフェイスを介してのみメンバを呼び出す場合は、インターフェイス メンバの明示的実装を検討します。
・ 分散をシミュレートする (つまり、オーバーライドされたメンバのパラメータや戻り値の型を変更する) 場合は、インターフェイス メンバの明示的な実装を検討します。
・ メンバを隠ぺいし、より適切な名前を持つ等価なメンバを追加する場合は、インターフェイス メンバの明示的な実装を検討します。
・ 明示的なメンバをセキュリティの境界として使用しないでください。
・ 機能を派生クラスによって専門的に処理する場合は、明示的に実装されたメンバと同じ機能を提供するプロテクト仮想メンバ関数を用意します。
基本的には明示的な実装はせず、必要な時にのみ検討するということですね。