这种使用泛型的模式是否有名称?

本文关键字:模式 是否 有名称 泛型 | 更新日期: 2023-09-27 18:12:58

//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%的通用功能,但绑定/解除绑定可能非常具体。在不将泛型暴露给最终用户的情况下,这种泛型声明模式是否有一个名称?

这种使用泛型的模式是否有名称?

我相信这不是一个模式,而是。net框架的泛型类型子系统的细节,它通过用具体类型替换泛型类型参数(在您的示例DateTime中)在运行时生成具体类型。所有其他关于共享共同行为的事情都被称为继承

如果要给它命名,我会叫它 details ,我同意Aliostad的说法,它是一个反模式。

泛型用于重用需要在类型之外描述的行为-或者至少在where子句强制的限制范围内。

您所看到的示例是一个泛型反模式。类型不应该重要,或者即使重要,也应该只在限制中定义才重要——即where子句。

所以基本上,一个泛型抽象类期望所有子类实现一个抽象,是不使用泛型。我不能简单地开始使用Generic<MyType>,这是泛型的要点。

我认为这是错误的。

在这种情况下,使用泛型抽象类/接口有一个轻微的好处,那就是类型安全实现PerformSpecificTask


<标题> 更新

我知道这是一个有争议的问题,我会被左右两派解雇,但我相信情况就是这样。

一个类可以愉快地继承一个泛型类并添加更多的功能。但是在本例中,是额外功能定义了该类的标识。当我不能只说Generic<MyOwnTypeOfVolition>时,我就失败了泛型的目标。然而,有时我关心的不是泛型,而是接口,这里似乎就是这种情况。


<标题>更新2 h1> p>你可以为它设置一个泛型接口/抽象类,并要求所有子类实现它,但是框架使它成为一个可选的情况,并且只支持实现该接口的类。