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

时间:2011-10-31 16:17:45

标签: c# generics design-patterns

//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%的常用功能,但绑定/解除绑定可能非常具体。

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

3 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:3)

如果我要说出来,我会称之为细节,我同意Aliostad的说法是反模式。

答案 2 :(得分:2)

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

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

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

我相信这会失败。

在这种情况下,使用通用抽象类/接口有轻微好处PerformSpecificTask 类型安全实现。


更新

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

类可以愉快地子类化泛型类并添加更多功能。但在这种情况下,额外的功能定义了该类的身份。当我不能只说Generic<MyOwnTypeOfVolition>时,我就打败了泛型的目标。然而,有时候,我关注的不是泛型 - 这是界面,这似乎就是这种情况。


更新2

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

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