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特性时,我是一个新手,所以我真的只是在黑暗中拍摄。
这是可能的工作,但它将需要一点工作在你的一部分。最简单的方法是在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来创建适当类型的实例。通过这种方式,您只需要在基类中使用一个方法,但这在速度方面效率较低。