2009-02-12 49 views
1

所以我使用CollectionBase作为自定义集合的继承类。我通过抽象类使用CollectionBase,以便我不重复知识(遵循DRY原则)。抽象类也被定义为泛型类。下面是我如何实现我的课程:抽象类 - 我过度考虑这个或做对了吗?

public abstract class GenericCollectionBase<T,C> : CollectionBase 
{ 
     //Indexders, virtual methods for Add, Contains, IndexOf, etc 
} 

我利用这个,所以我不必在10个以上的类中实现这些基方法。

我的问题是我会采取这一太远,当我重写Equals方法是这样的:

public override bool Equals(object obj) 
    { 
     if (obj is C) 
     { 
      GenericCollectionBase<T, C> collB = 
       obj as GenericCollectionBase<T, C>; 

      if (this.Count == collB.Count) 
      { 
       for (int i = 0; i < this.Count; ++i) 
       { 
        if (!this[i].Equals(collB[i])) 
         return false; 
       } 
       return true; 
      } 
     } 
     return false; 
    } 

我是想完成太多与我的抽象,或该做的正确方法?

编辑:这是为.NET 2.0编写,并没有进入到3.5利用之类的东西LINQ

回答

3

我不相信你正在努力完成太多。如果一个抽象类没有任何实现,或者其他定义了功能的方法,那么它们就是接口。

我会改变的唯一的事情是使用EqualityComparer<T>而不是等于this[i]collB[i]的比较。

+0

我使用时得到这个错误 “如果(!EqualityComparer .Equals(此[I],collB [I]))” 一个对象引用是所必需的非静态字段,方法或属性“系统。 Collections.Generic.EqualityComparer .Equals(T,T)' – 2009-02-12 17:07:30

0

庄家防范IDictionary的扩展方法将更为有用。还有一些像LINQ相交的方法可能有用。

1

嗯,首先,这是奇怪:

if (obj is C) 
    { 
     GenericCollectionBase<T, C> collB = obj as GenericCollectionBase<T, C>; 

我假设你意思是:

GenericCollectionBase<T, C> collB = obj as GenericCollectionBase<T, C>; 
    if (collB != null) 
    { 
     ... 

我觉得你过想这,除非你真的,真的需要两个不同具有相同内容的集合被视为相等。我把这个逻辑放在另一个显式调用的方法或者一个相等比较器中。

0

我不知道你是否想要完成太多,但我认为你正在尝试完成错误的事情。在某些情况下,您可能希望这种类型的集合具有相同的平等性,但它应该是选择性的,并且从该类型的名称中显而易见。我创建了一个ListValue,其中包含您正在使用的平等类型,但它始终也是不可变的。另外,如果打算进行这种类型的相等性检查,则使用object.ReferenceEquals进行初始测试可以避免在将对象与自身进行比较时不得不迭代大型集合。