【问题标题】:Create derived classes with parameterized constructors using factory method with type parameter使用带有类型参数的工厂方法创建带有参数化构造函数的派生类
【发布时间】:2014-11-14 18:27:46
【问题描述】:

我有一个抽象基类和一个派生类。让我们称他们为BaseDerived

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


    【解决方案1】:

    您可以使用激活器来创建实例:

    public static T Create<T>(int number) where T : Base
    {
        return (T) Activator.CreateInstance(typeof (T), number);
    }
    

    在这种情况下,如果您创建新的派生类,则无需更新方法。这假设您总是有一个带有单个整数参数的构造函数。如果这样的构造函数不存在,你会得到一个运行时异常。

    【讨论】:

      猜你喜欢
      • 2023-03-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-29
      • 2021-02-07
      • 1970-01-01
      • 2011-05-07
      相关资源
      最近更新 更多