抽象化实现的基类是被设计成用来协助开发者实现抽象类和接口(抽象化)的类。它们为抽象化而提供了实现的细节并且在一些情况下它们是不需要进行继承就是能够被使用的。例如,Collection 能够被用来创建一个集合或者能够被继承来定义一个被强类型化的集合类。
下列代码范例示范了使用 Collection 类来创建一个被强类型化的集合对象。
public class PointManager : IEnumerable { Collection<Point> pointCollection = new Collection<Point>(); public void AddPoint(Point p) { pointCollection.Add(p); } public bool RemovePoint(Point p) { return pointCollection.Remove(p); } public IEnumerator GetEnumerator() { return pointCollection.GetEnumerator(); } }
下列代码范例示范了使用 Collection 类来定义一个被强类型化的集合。
public class PointCollection : Collection<Point> {}
CollectionBase 类是 .NET Framework 基类的另外一个范例。这个类能够帮助开发者实现非常规的集合。并且不能够像 Collection 和 CollectionBase 一样能够直接被使用。
抽象化实现的基类应该只在它们为库的开发者提供重要价值的时候才被提供成库的一部分。在基类只有助于实现一个库的情况下,基类就不应该是公开可见的。要使用一个内在的基类来简化库的开发,公共成员就应该把任务委托给基类来替代从基类那里进行继承的做法。
考虑基类的抽象化,即使它们不包含任何抽象的成员。这明确地传达给用户:这个类是单独被设计成被继承的。
考虑把基类存放到来自于主要情节 API 的一个单独的命名空间中。通过定义,基类就是有意的可扩展性情节并且多数用户对此都不感兴趣。
避免以 Base 作为后缀对基类进行命名,如果这个类准备在公开的 API 中被使用。
如果库把基类暴露成了一个返回类型或参数类型,那么它就不应该使用 Base 来作为名称的后缀。