这种使用泛型的模式是否有名称?
本文关键字:模式 是否 有名称 泛型 | 更新日期: 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>你可以为它设置一个泛型接口/抽象类,并要求所有子类实现它,但是框架使它成为一个可选的情况,并且只支持实现该接口的类。 标题>标题>