使用基类的静态方法创建派生类的实例
本文关键字:派生 实例 创建 静态方法 基类 | 更新日期: 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.Make
和AnotherDerived.Make
做其他事情的选项(而且返回不同的类型,如您的示例所做的),除非您认为代码生成是一个选项。这些其实并不是不同的方法。它们充当Base.Make
的别名,除非您在每个派生类中定义一个新方法。
您可以为每个派生类定义转换构造函数并像这样使用make: (derived) derived . make ();