2009-02-12 5 views
1

J'utilise donc CollectionBase comme une classe héritée pour les collections personnalisées. J'utilise CollectionBase à travers une classe abstraite afin que je ne répète pas les connaissances (en suivant le principe DRY). La classe abstraite est définie comme une classe générique également. Voici comment je suis ma classe de mise en œuvre:Abstract Class - Suis-je en train de trop penser ou de faire les choses correctement?

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

J'utiliser ce donc je ne pas mettre en œuvre ces méthodes de base dans les classes 10+.

Ma question est ce que je prends trop loin quand je remplacer la méthode Equals comme ceci:

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; 
    } 

Suis-je essayer de faire trop avec mon résumé, ou le faire dans le bon sens?

EDIT: Ceci est écrit pour .NET 2.0 et n'ont pas accès à 3,5 à utiliser des choses comme LINQ

Répondre

3

Je ne crois pas que vous essayez d'accomplir trop. Si une classe abstraite était censée n'avoir aucune implémentation, ou d'autres méthodes qui définissent la fonctionnalité, alors elles seraient des interfaces. La seule chose que je voudrais changer est d'utiliser EqualityComparer<T> au lieu d'être égal à this[i] et collB[i].

+0

Je reçois cette erreur lors de l'utilisation "if (! EqualityComparer Equals (ce [i], collB [i]))" Une référence d'objet est nécessaire pour le champ non statique, la méthode ou la propriété « du système. Collections.Generic.EqualityComparer .Equals (T, T) ' –

+1

L'égalité (T, T) n'est pas une méthode statique; EqualityComparer .Default.Equals (this [i], collB [i]) est ce que vous voulez. –

+0

Génial, merci! –

0

Faire une méthode d'extension contre IDictionary serait beaucoup plus utile. Il y a aussi des méthodes comme Intersect de LINQ qui peuvent être utiles.

1

Eh bien, tout d'abord, cela est bizarre:

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

Je suppose que vous vouliez dire que:

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

Je pense que vous êtes trop penser cela, sauf si vous avez vraiment, vraiment besoin de deux différentes collections avec le même contenu à considérer comme égales. Je mettrais cette logique dans une autre méthode à appeler explicitement ou dans un comparateur d'égalité.

0

Je ne sais pas si vous essayez d'accomplir trop, mais je pense que vous essayez d'accomplir la mauvaise chose. Il y a des cas où vous pourriez vouloir ce type d'égalité pour les collections, mais il devrait être opt-in et évident à partir du nom du type. J'ai créé un ListValue <> avec le type d'égalité que vous utilisez, mais il a toujours été immuable.

De même, si vous souhaitez effectuer ce type de vérification d'égalité, un test initial utilisant object.ReferenceEquals peut vous éviter d'avoir à parcourir une collection volumineuse lorsque vous comparez un objet à lui-même.

Questions connexes