//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%的常用功能,但绑定/解除绑定可能非常具体。
这种通用声明模式是否有名称,而不将通用暴露给最终用户?
答案 0 :(得分:3)
我认为这不是一种模式,而是.NET Framework的通用类型子系统的细节,它通过用具体类型(在您的示例中为DateTime)替换泛型类型参数来在运行时生成具体类型。有关共享共同行为的所有其他事项称为Inheritance
答案 1 :(得分:3)
如果我要说出来,我会称之为细节,我同意Aliostad的说法是反模式。
答案 2 :(得分:2)
泛型用于重用需要在类型之外描述的行为 - 或者至少在where
子句强制执行的限制范围内。
你见过的例子,恕我直言,是一个泛型反模式。类型无关紧要,如果确实如此,只要它在限制中定义 - 即where
条款。
基本上,一个希望所有子类都实现抽象的通用抽象类是不使用泛型。我不能简单地开始使用Generic<MyType>
这是泛型的点。
我相信这会失败。
在这种情况下,使用通用抽象类/接口有轻微好处,PerformSpecificTask
类型安全实现。
我知道这是一个有争议的问题,我会被左右分别解雇,但我相信情况就是这样。
类可以愉快地子类化泛型类并添加更多功能。但在这种情况下,额外的功能定义了该类的身份。当我不能只说Generic<MyOwnTypeOfVolition>
时,我就打败了泛型的目标。然而,有时候,我关注的不是泛型 - 这是界面,这似乎就是这种情况。
一个典型的例子是.NET Framework中的IConvertible
。
您可以为它设置一个通用接口/抽象类,并要求所有子类实现它,但框架使它成为一个可选案例,并且只支持实现该接口的类。