c#基类可以在静态成员中调用子类的构造函数吗?

本文关键字:子类 构造函数 调用 基类 静态成员 | 更新日期: 2023-09-27 18:02:59

我有一个抽象泛型类"BaseClass"和一个类"SubClass"定义如下:

public class SubClass : BaseClass<SubClass>
我想在基类中定义一个静态方法,签名如下:
public static T GetSub() 

然后在子类上调用它这样它就返回了子类

的一个实例
SubClass sub = SubClass.GetSub();

GetSub必须调用SubClass的默认构造函数,然后返回实例。

这开始看起来有点疯狂,但我至少想知道这是否可能。当谈到c#更复杂的OOP特性时,我是一个新手,所以我真的只是在黑暗中拍摄。

c#基类可以在静态成员中调用子类的构造函数吗?

这是可能的工作,但它将需要一点工作在你的一部分。最简单的方法是在BaseClass

的声明中给T new约束。
abstract class BaseClass<T> where T : new() {
  public static T GetSub() {
    return new T();
  }
}

另一种方法是使用Activator.CreateInstance

abstract class BaseClass<T> {
  public static T GetSub() { 
    return Activator.CreateInstance<T>();
  }
}

从功能上讲,这与最初的方法没有什么不同。CreateInstance<T>方法将查找无参数构造函数并调用它。实际上,new T()调用通常会编译为Activator.CreateInstance<T>调用。

这行不通。你必须在基类中创建一个虚方法,在每个子类中重写并使其返回该子类的实例。
或者您可以使用反射来调用GetType(),并使用Activator来创建适当类型的实例。通过这种方式,您只需要在基类中使用一个方法,但这在速度方面效率较低。