如何设计继承的集合

时间:2009-02-27 19:47:18

标签: c# oop inheritance collections .net-2.0

我正在用C#编写一个有自定义集合的程序。自定义集合对其类型为ResultInfo的成员执行一些有用的聚合函数(AllSuccessful,%Successful等)。我有几个派生自ResultInfo(UploadResultInfo,XUploadResultInfo和YUploadResultInfo)的类,并希望从ResultInfoCollection继承具有其他聚合函数的其他集合。按照规定执行此操作的唯一问题是它留下了无用的

public void Add(ResultInfo item)
{ 

}

关于集合。 澄清:此方法采用ResultInfo类型的参数,但添加到UploadResultInfoCollection的ResultInfo将引发错误。是否有一种优雅的方法来解决我的问题?我已经考虑了泛型,但我不太清楚它是如何工作的。

4 个答案:

答案 0 :(得分:2)

要定义处理ResultInfo的任何子项的泛型类,只需将其定义为

即可
public class MyCollection<T> : ICollection<T>
where T : ResultInfo
{

     ... the required methods ... just use "T" instead of "ResultInfo" ...

    public void Add(T item) {}
}

稍后您可以通过

使用它
 MyCollection<FooResultInfo> coll = new MyCollection<FooResultInfo>();

只要尝试使用它们,它们就不会太困难,而且边做边学是最好的方法......

答案 1 :(得分:0)

我不确定你是如何使用无用的Add方法的。

如果集合自身填充,则可以将Add方法设为私有。

如果您希望“继承的”其他集合不公开Add方法,请使用组合而不是继承。

答案 2 :(得分:0)

考虑您的有用方法是否真的需要是实例方法。

他们是否需要在其他操作发生时维护状态,或者是否可以使用公开可用(或内部可用)API?

如果是这样,那么简单地使它们成为静态方法(扩展方法可能是一个好主意)并且不用担心继承。如果这些方法在IEnumerable <T>上有意义,那就更好了,通过这样做,你可以使你的实用功能更加可用,从而有用。

使用生成的函数包只需要导入相关的命名空间。

答案 3 :(得分:0)

如果你所做的只是为现有的集合类型提供一些额外的方法,那么考虑简单地为该类型定义扩展方法并使用普通的泛型集合。