明示的なインターフェイスの実装では、アクセス修飾子を指定できません。インターフェイス メンバーを (メンバー名の前にインターフェイス名を指定して) 明示的に実装すると、そのインターフェイスを使用してのみそのメンバーにアクセスできます。基本的に、次の場合:
System.Collections.Specialized.StringDictionary IWorkItemControl.Properties
{
get { return properties; }
set { properties = value; }
}
あなたはできません:
MyClass x = new MyClass();
var test = x.Properties; // fails to compile
// You should do:
var test = ((IWorkItemControl)x).Properties; // accessible through the interface
EII にはいくつかの使用例があります。たとえば、Close
取得したリソースを解放するメソッドをクラスに提供したいが、それでも を実装したいとしますIDisposable
。あなたがすることができます:
class Test : IDisposable {
public void Close() {
// Frees up resources
}
void IDisposable.Dispose() {
Close();
}
}
Close
このように、クラスのコンシューマーは直接呼び出すことしかできませんが ( Dispose
Intellisense リストにも表示されません)、期待される場所 (ステートメントなど)でTest
クラスを使用できます。IDisposable
using
EII のもう 1 つのユース ケースは、2 つのインターフェイスに対して同じ名前のインターフェイス メンバーの異なる実装を提供することです。
interface IOne {
bool Property { get; }
}
interface ITwo {
string Property { get; }
}
class Test : IOne, ITwo {
bool IOne.Property { ... }
string ITwo.Property { ... }
}
ご覧のとおり、EII がなければ、この例の両方のインターフェースを単一のクラスに実装することさえできません(プロパティは戻り値の型だけが異なるため)。また、別のインターフェイスを介して、クラスの個々のビューに対して意図的に異なる動作を提供したい場合もあります。