【发布时间】:2014-11-14 18:27:46
【问题描述】:
我有一个抽象基类和一个派生类。让我们称他们为Base 和Derived。
Base 有构造函数:
public Base(int number)
{
// do something with number
}
并且Derived 类将始终具有构造函数(even though this cannot be ensured through an interface,但在我的程序中仍然是这种情况):
public Derived(int number) : base(number)
{
// do some other stuff
}
现在,我想要一个工厂方法来创建从Base 派生的对象,应该这样调用:
Base.Create<Derived>(someNumber);
但我不知道如何以正确的方式实现此方法。我认为最优雅的解决方案是这样做:
public static T Create<T>(int number) where T : Base, new(int)
{
return new T(number);
}
但是好像C# does not support the parameterized constructor constraintnew(int),只有无参的那个。这个解决方案会很清楚,它准确地表达了我想要的。哦,好吧..
相反,我基本上可以打开类型参数并创建正确类型的实例,如下所示:
public static Base Create<T>(int number) where T : Base, new(int)
{
if (typeof(T) == typeof(Derived))
{
return new Derived(number);
}
// and so on for all other derived types
}
但这要求我每次创建新的派生类时都更新方法,这很不幸。此外,typeof(T) == typeof(Derived) 似乎太骇人听闻了。此外,使用这种方法,工厂方法的返回类型似乎必须是 Base 而不是 T,这也是不幸的。在这种情况下,我可以很容易地使用枚举而不是类型参数。
我想知道是否有更好的方法来实现我想要的?
【问题讨论】:
标签: c# generics polymorphism