//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);
Я видел и использовал этот паттерн несколько раз, и он очень полезен для PR. Обеспечение общей функциональности для ряда подклассов, зависящих от типа. Например, это может быть модель для контроллеров / презентаторов, специфичная для типа объекта домена, который является центральным для страницы (страниц), для управления которыми используется класс; базовые операции, такие как извлечение / сохранение, могут использовать 100% общие функции, но привязка / отключение может быть очень специфичной.
Есть ли имя для этого шаблона общего объявления без предоставления общего доступа конечному пользователю?