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

时间:2015-06-05 19:18:47

标签: c# oop inheritance static-methods

关于以下模型,如何编写方法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
{
}

5 个答案:

答案 0 :(得分:3)

你会把它写成:

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

Base无法使用Make方法,它们都是静态的,因此彼此没有关系。

答案 1 :(得分:3)

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

答案 2 :(得分:3)

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

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>
{
}

答案 3 :(得分:1)

要只使用一种方法,您可以使用通用方法:

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的别名,除非您在每个派生类中定义新方法。

答案 4 :(得分:0)

您可以为每个派生类定义转换构造函数,并使用如下所示的make :(派生)Derived.Make();