2009-02-12 16 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進行初始測試可以避免在將對象與自身進行比較時不得不迭代大型集合。