我正在用C#编写一个有自定义集合的程序。自定义集合对其类型为ResultInfo的成员执行一些有用的聚合函数(AllSuccessful,%Successful等)。我有几个派生自ResultInfo(UploadResultInfo,XUploadResultInfo和YUploadResultInfo)的类,并希望从ResultInfoCollection继承具有其他聚合函数的其他集合。按照规定执行此操作的唯一问题是它留下了无用的
public void Add(ResultInfo item)
{
}
关于集合。 澄清:此方法采用ResultInfo类型的参数,但添加到UploadResultInfoCollection的ResultInfo将引发错误。是否有一种优雅的方法来解决我的问题?我已经考虑了泛型,但我不太清楚它是如何工作的。
答案 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)
如果你所做的只是为现有的集合类型提供一些额外的方法,那么考虑简单地为该类型定义扩展方法并使用普通的泛型集合。