Обобщение используется для повторного использования поведения, которое необходимо описать за пределами типа - или, по крайней мере, в рамках ограничений, наложенных предложением where
.
В качестве примера выЯ видел, ИМХО, это универсальный анти-шаблон .Тип не должен иметь значения или, если он имеет значение, должен иметь значение только в том случае, если он определен в ограничениях - например, where
предложение.
Таким образом, по сути, общий абстрактный класс, который ожидает, что все подклассы реализуют абстрактный, -1011 * не использует универсальность .Я не могу просто начать использовать Generic<MyType>
, что является точкой генериков.
Я считаю, что это побеждает точку.
В этом случае есть небольшое преимущество в использовании общего абстрактного класса / интерфейса, и это тип безопасности достижение для PerformSpecificTask
.
ОБНОВЛЕНИЕ
Я знал, что это спорный вопрос, и меня уволили бы влево и вправо, но я верю, что это так.
Класс может счастливо подклассировать общий класси добавить больше функциональности.Но в этом случае именно дополнительная функциональность определяет идентичность этого класса. Когда я не могу просто сказать Generic<MyOwnTypeOfVolition>
, тогда я побеждаю цель обобщений.Иногда, однако, меня беспокоит не общий вид - это интерфейс , который, кажется, имеет место здесь.
ОБНОВЛЕНИЕ 2
Классический пример - IConvertible
в .NET Framework.
Вы можете установить для него общий интерфейс / абстрактный класс и попросить все подклассы реализовать его, но каркас делает его необязательным и поддерживает его только для классов, реализующих интерфейс.