显式实现接口成员

接口是支持一些功能的协定。 实现接口的类必须为接口中指定的成员提供实现细节。 例如,IEnumerator 接口定义成员签名,必须实现成员签名才能支持对一组对象(如集合)进行枚举。 若要实现 IEnumerator,类必须实现 CurrentMoveNextReset 成员。

当接口成员由类显式实现时,只能通过使用对接口的引用来访问该成员。 这将导致隐藏接口成员。 显式实现接口成员的常见原因不仅是为了符合接口的协定,而且也是为了以某种方式改进它(例如,提供应用来代替接口的弱类型方法的强类型方法)。 显式实现接口成员的另一个常见原因是存在不应由开发人员调用显式接口成员的时候。 例如,GetObjectData 成员是最常显式实现的,因为它由序列化基础结构调用而不用于从代码调用。

下列设计准则有助于确保您的库设计仅在需要时使用显式接口实现。

如果没有充分理由,应避免显式实现接口成员。

要理解显式实现需要具备很高深的专业知识。 例如,很多开发人员不知道显式实现的成员是可以公共调用的,即使其签名是私有的也一样。 由于这个原因,显式实现的成员不显示在公共可见的成员列表中。 显式实现成员还会导致对值类型的不必要装箱。

如果成员只应通过接口调用,则考虑显式实现接口成员。

这主要包括支持 .NET Framework 基础结构(如数据绑定或序列化)的成员。 例如,IsReadOnly属性只应由数据绑定基础结构通过使用对ICollection<T> 接口的引用来访问。 由于满足此准则,List<T> 类显式实现该属性。

考虑显式实现接口成员以模拟变体(即,更改重写成员中的参数或返回类型)。

为了提供接口成员的强类型版本,通常会这么做。

考虑显式实现接口成员以隐藏一个成员并添加一个具有更好名称的等效成员。

这样可以有效地重命名成员。 例如,Stream 显式实现 Dispose 并在相应的位置提供 Close 方法。

不要将显式成员用作安全边界。

显式实现成员不提供任何安全性。 通过使用对接口的引用,这些成员都是可以公共调用的。

如果显式实现的成员的功能意在由派生类特殊化,则一定要提供具有相同功能的受保护虚拟成员。

不能重写显式实现的成员。 如果在派生类中重新定义成员,则派生类不能调用基类实现。 应通过使用与显式接口成员相同的名称或将 Core 附加到接口成员名称来命名受保护成员。

部分版权所有 2005 Microsoft Corporation。 保留所有权利。

部分版权所有 Addison-Wesley Corporation。 保留所有权利。

设计指引的详细信息,请参阅"框架设计准则: 公约、 成语和可重复使用的模式。网络图书馆"书 Krzysztof Cwalina 和布拉德 · 艾布拉姆斯,2005年艾迪生 - 韦斯利,发表。

请参见

概念

接口设计

其他资源

成员设计准则

类库开发的设计准则