Есть ли название для этого шаблона использования дженериков? - PullRequest
9 голосов
/ 31 октября 2011
//this class (or interface if you like) is set up as generic...
public abstract class GenericBase<T> 
{
    public T PerformBasicTask(T in) { ... }
}

//... but is intended to be inherited by objects that close the generic...
public class ConcreteForDates:GenericBase<DateTime>
{
    public DateTime PerformSpecificTask(DateTime in) { ... }
}

//... so that consuming code never knows that a generic is involved
var myDateConcrete = new ConcreteForDates(); //look ma, no GTP!
//These two methods look alike, and there is no generic type inference,
//even with PerformBasicTask().
var basicResult = myDateConcrete.PerformBasicTask(DateTime.Now);
var specificResult = myDateConcrete.PerformSpecificTask(DateTime.Today);

//does not compile because T is understood by inheritance to be a DateTime,
//even though PerformBasicTask()'s implementation may well handle an int.
var anotherBasicResult = myDateConcrete.PerformBasicTask(1);

Я видел и использовал этот шаблон несколько раз, и он очень полезен для предоставления общих функций для ряда подклассов, зависящих от типа.Например, это может быть модель для контроллеров / презентаторов, специфичная для типа объекта домена, который занимает центральное место на странице (ах), которой управляет класс;базовые операции, такие как извлечение / сохранение, могут использовать на 100% общую функциональность, но привязка / открепление может быть очень специфичным.

Существует ли имя для этого шаблона обобщенного объявления без предоставления универсального значения конечному пользователю?

Ответы [ 3 ]

3 голосов
/ 31 октября 2011

Я полагаю, что это не шаблон, а специфика подсистемы универсального типа .NET Framework, которая генерирует конкретный тип во время выполнения путем замены параметра универсального типа конкретным типом (в вашем примере DateTime).Все остальные вещи, касающиеся общего поведения, известны как Наследование

3 голосов
/ 31 октября 2011

Если бы я назвал это, я бы назвал это Специфика , и я согласен с Алиостадом в том, что это анти-паттерн.

2 голосов
/ 31 октября 2011

Обобщение используется для повторного использования поведения, которое необходимо описать за пределами типа - или, по крайней мере, в рамках ограничений, наложенных предложением where.

В качестве примера выЯ видел, ИМХО, это универсальный анти-шаблон .Тип не должен иметь значения или, если он имеет значение, должен иметь значение только в том случае, если он определен в ограничениях - например, where предложение.

Таким образом, по сути, общий абстрактный класс, который ожидает, что все подклассы реализуют абстрактный, -1011 * не использует универсальность .Я не могу просто начать использовать Generic<MyType>, что является точкой генериков.

Я считаю, что это побеждает точку.

В этом случае есть небольшое преимущество в использовании общего абстрактного класса / интерфейса, и это тип безопасности достижение для PerformSpecificTask.


ОБНОВЛЕНИЕ

Я знал, что это спорный вопрос, и меня уволили бы влево и вправо, но я верю, что это так.

Класс может счастливо подклассировать общий класси добавить больше функциональности.Но в этом случае именно дополнительная функциональность определяет идентичность этого класса. Когда я не могу просто сказать Generic<MyOwnTypeOfVolition>, тогда я побеждаю цель обобщений.Иногда, однако, меня беспокоит не общий вид - это интерфейс , который, кажется, имеет место здесь.


ОБНОВЛЕНИЕ 2

Классический пример - IConvertible в .NET Framework.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...