显式接口实现不允许您指定任何访问修饰符。当您显式实现接口成员时(通过在成员名称之前指定接口名称),您只能使用该接口访问该成员。基本上,如果你这样做:
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 的另一个用例是为两个接口提供同名接口成员的不同实现:
interface IOne {
bool Property { get; }
}
interface ITwo {
string Property { get; }
}
class Test : IOne, ITwo {
bool IOne.Property { ... }
string ITwo.Property { ... }
}
如您所见,如果没有 EII,甚至不可能在单个类中实现此示例的两个接口(因为属性仅在返回类型上有所不同)。在其他情况下,您可能希望通过不同的接口有意为类的各个视图提供不同的行为。