Использование пустого родительского класса просто для группировки других классов. Есть ли лучший подход? - PullRequest
1 голос
/ 30 апреля 2009

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

У меня также есть несколько методов, которые работают с этими классами. Некоторые из них являются шаблонами следующего стиля:

public SomeClass
{
    public void SomeMethod<T> (T argument) where T : BaseClass
    {
        /* Do something */
    }
}

Так что я использую это ключевое слово WHERE просто для защиты кода (я полагаю, от себя), чтобы я по ошибке не передавал этому методу что-то еще.

Естественно, я сделал эти другие классы производными от BaseClass, который пуст и не имеет никакой другой цели (по крайней мере на данный момент), чем группировать другие классы.

Возможно, это не очень хороший подход, но в любом случае я его использую.

Есть ли лучший способ сделать это?

РЕДАКТИРОВАТЬ: После рассмотрения я решил не придерживаться этого подхода и просто удалил этот базовый класс. Хорошо без этого. В любом случае, я не могу сделать код абсолютно совершенным, и чем меньше ненужных вещей, тем лучше.

Ответы [ 3 ]

7 голосов
/ 30 апреля 2009

Использовать маркерный (пустой) интерфейс вместо базового класса:

public void SomeMethod<T> (T argument) where T : ISomeInterface
2 голосов
/ 07 мая 2009

+ 1 на ответ Джеффа. Интерфейсы тегирования («маркер») распространены как в C #, так и в средах Java. Они позволяют назначать общий тип «классу А», так что другой класс («класс В») может не знать о конкретном типе класса А.

Как и во всем этом гибком, его легко использовать неправильно, но в вашем случае он определенно отвечает всем требованиям.

0 голосов
/ 30 апреля 2009

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

Ваш метод SomeMethod (), очевидно, не ссылается ни на одно из свойств аргумента (или, если это так, он также должен приводить аргумент к другому типу (ам)); В чем причина защиты кода «от себя»? Что произойдет, если вы вызовете метод, передающий объект, который не был утвержден?

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

...