ASP.NET Lab

The Best Web, The Best Future

博客园 首页 新随笔 订阅 管理

接口是一种支持功能的约定。实现了接口的类必须为接口中被指定的成员提供实现的细节。例如,IEnumerator 接口定义了一个必须实现并且通过一个对象集(如集合)来支持枚举操作的成员签名。要实现 IEnumerator 接口,派生类就必须实现 Current、MoveNext,以及 Reset 成员。

在接口的一个成员通过一个类而明确地被实现的时候,这个成员就只能够通过使用该接口的一个引用而被访问。这样做能够起到隐藏接口成员的作用。明确地实现接口成员的一个公共原因并不仅仅是遵守该接口的约定,而是在某些方面来进行改进(例如,提供应该在接口的弱类型方法那里被使用的强类型化方法)。明确地实现接口成员的另一个公共原因就是在明确的接口成员不应该被开发者进行调用的时候。例如,GetObjectData 是经常明确地被实现的,因为它通过序列化机制而进行调用并且不会被扩展到代码中而被调用。

下列设计指导方针有助于确保你的库设计只在适当的时候才使用明确的接口实现。

在没有强烈要求这样做的情况下,应该避免明确地实现接口的成员。

理解到明确的实现需要一种高级的专门技术。例如,许多开发者并不知道一个明确被实现的成员是可以公开被调用的,尽管它的签名被标记为是私有的。因此,明确被实现的成员不会出现在公共可见成员的列表中。明确地实现一个成员同样能够导致对值类型的不必要的装箱操作。

如果被扩展的成员只能够通过接口而被调用,考虑明确地实现接口的成员。

这主要包括了支持 .NET Framework 架构的成员(如数据绑定或序列化)。例如,IsReadOnly 属性是被扩展并且只能够使用 ICollection 接口的一个引用并通过数据绑定架构才能够被访问的。而 List 类则明确地实现了属性,因为它是适宜于这个指导方针的。

考虑明确地实现接口的成员来模拟变化(也就是说,在重载成员中改变参数或返回类型)。

这样做经常能够为接口成员提供一个被类型化的版本。

考虑明确地实现接口的成员来隐藏一个成员并且使用一个更好的名称来添加一个与之等价的成员。

这可以有效地对成员进行重命名。例如,Stream 既明确地实现了 Dispose 方法又在它的空间中提供了 Close 方法。

不要把明确的成员当成是一个安全边界。

明确地实现一个成员并不能够提供任何的安全性。这些成员可以通过使用接口的一个引用来进行公开调用。

如果功能想要通过派生类而被序列化,就提供一个被保护的虚拟成员来提供与明确地被实现的成员相同的功能。

明确地被实现的成员不能够被重载。如果它们在派生类中被重新定义,那么在派生类中调用基类的实现将是不被允许的。你应该通过使用与明确的接口成员的名称相同的名称来命名被保护的成员,或者使用 Core 来作为接口成员的名称附属。

posted on 2007-01-30 20:13  Laeb  阅读(587)  评论(0编辑  收藏  举报