使用基类的静态方法创建派生类的实例

本文关键字:派生 实例 创建 静态方法 基类 | 更新日期: 2023-09-27 17:53:37

对于下面的模型,我如何编写方法Make来实现使用目的?

注意:我不想在每个派生类中重复Make方法。

用法:

Derived instance = Drived.Make();
AnotherDerived instance = AnotherDrived.Make();
ThirdDerived instance = ThirdDrived.Make();

模型:

class Base
{
   public static Base Make()
   {
       // What to write here?
   }
}
class Derived : Base
{
}
class AnotherDerived : Base
{
}
class ThirdDerived : Base
{
}

使用基类的静态方法创建派生类的实例

静态方法不能被继承。从语法上看,它们看起来确实如此,但在编译时,基类方法被直接调用。您必须在基类中以某种方式指示要创建的类型。我认为这可以通过在方法上使用泛型(如另一个答案所建议的)或在类本身上使用泛型来完成:

class Base<T> where T : new()
{
    public static T Make()
    {
        return new T();
    }
}
class Derived : Base<Derived>
{
}
class AnotherDerived : Base<AnotherDerived>
{
}
class ThirdDerived : Base<ThirdDerived>
{
}

你可以这样写:

class Derived : Base
{
   public static Derived Make()
   {
       ???
   }
}

Base有一个Make方法是无关的,它们都是静态的,所以彼此之间没有关系

尽管人们给出了所有好的解决方案,但我得出的结论是,这是不可能的。我的问题的根源是误解了静态方法在派生类上的工作方式。我刚刚发现Derived.Make()立即编译为Base.Make(),因此Base永远不知道Make被调用的是什么类型。Derived.Make()只是一个快捷方式

如果只有一个方法,可以使用泛型方法:

class Base
{
   public static T Make<T>() where T : Base
   {
       if (typeof(T) == typeof(Derived)) 
       {
            return (T)(object)new Derived();
       }
       // obviously more cases in here. just for illustration.
       else
       {
            return null;
       }
   }
}

那么你必须把它命名为

Derived d = Base.Make<Derived>();

没有在基类中编写一个方法并让Derived.MakeAnotherDerived.Make做其他事情的选项(而且返回不同的类型,如您的示例所做的),除非您认为代码生成是一个选项。这些其实并不是不同的方法。它们充当Base.Make的别名,除非您在每个派生类中定义一个新方法。

您可以为每个派生类定义转换构造函数并像这样使用make: (derived) derived . make ();