这种使用generics的模式有名称吗?

//this class (or interface if you like) is set up as generic... public abstract class GenericBase { public T PerformBasicTask(T in) { ... } } //... but is intended to be inherited by objects that close the generic... public class ConcreteForDates:GenericBase { 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); 

我已经多次看到并使用过这种模式,它对于在一系列特定类型的子类中提供通用function非常有用。 例如,这可以是控制器/演示者的模型,该控制器/演示者特定于一种域对象,该对象是该类用于控制的页面的核心; 检索/持久性等基本操作可能使用100%的常用function,但绑定/解除绑定可能非常具体。

这种通用声明模式是否有名称,而不将通用暴露给最终用户?

我相信这不是一种模式,而是.NET Framework的通用类型子系统的细节,它通过用具体类型(在您的示例中为DateTime)替换generics类型参数来在运行时生成具体类型。 有关共享共同行为的所有其他事项称为inheritance

如果我给它命名,我会称之为细节 ,我同意Aliostad,因为它是一种反模式。

generics用于重用需要在类型之外描述的行为 – 或者至少在where子句强制执行的限制内。

你见过的例子,恕我直言,是一个generics反模式 。 类型应该无关紧要,如果确实如此,只要它在限制中定义 – 即where子句。

基本上,一个希望所有子类都实现抽象的通用抽象类不使用泛化 。 我不能简单地开始使用Generic ,这是generics的关键。

我认为这是有道理的。

在这种情况下,使用通用抽象类/接口有一点好处 ,那就是PerformSpecificTask 类型安全实现。


UPDATE

我知道这是一个有争议的问题,我会被左右开枪,但我相信情况就是如此。

类可以愉快地子类化generics类并添加更多function。 但在这种情况下,它是定义该类标识额外function。 当我不能只说Generic我已经打败了generics的目标。 然而,有时候,它并不是我所关注的generics – 它似乎就是这里的界面


更新2

一个典型的例子是.NET Framework中的IConvertible

您可以为它设置一个通用接口/抽象类,并要求所有子类实现它,但框架使它成为一个可选的案例,并且只支持实现该接口的类。