Абстрактный класс - я слишком обдумываю это или делаю это правильно? - PullRequest
1 голос
/ 12 февраля 2009

Поэтому я использую CollectionBase как унаследованный класс для пользовательских коллекций. Я использую CollectionBase через абстрактный класс, чтобы не повторять знание (следуя принципу СУХОЙ). Абстрактный класс также определяется как универсальный класс. Вот как я реализую свой класс:

 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

Ответы [ 4 ]

3 голосов
/ 12 февраля 2009

Я не верю, что вы пытаетесь достичь слишком многого. Если бы абстрактный класс должен был вообще не иметь никакой реализации или других методов, определяющих функциональность, тогда они были бы интерфейсами.

Единственное, что я хотел бы изменить, - это использовать EqualityComparer<T> вместо равных для сравнения this[i] и collB[i].

1 голос
/ 12 февраля 2009

Ну, во-первых, это странно:

    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 голосов
/ 15 октября 2009

Я не знаю, пытаетесь ли вы достичь слишком многого, но я думаю, что вы пытаетесь достичь неправильного. В некоторых случаях вам может потребоваться равенство типов для коллекций, но оно должно быть подписано и очевидно из названия типа. Я создал ListValue <> с типом равенства, который вы используете, но он также всегда был неизменным.

Кроме того, если вы собираетесь выполнять этот тип проверки равенства, начальный тест с использованием object.ReferenceEquals может избавить вас от необходимости перебирать большую коллекцию при сравнении объекта с самим собой.

0 голосов
/ 12 февраля 2009

Создание метода расширения для IDictionary было бы гораздо более полезным. Есть также такие методы, как Intersect из LINQ, которые могут быть полезны.

...