3

我有一个抽象的泛型类“BaseClass”和一个定义为这样的类“SubClass”:

public class SubClass : BaseClass<SubClass>

我想在基类中定义一个静态方法,签名如下:

public static T GetSub() 

然后在子类上调用它,以便它返回子类的一个实例

SubClass sub = SubClass.GetSub();

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

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

4

2 回答 2

3

有可能完成这项工作,但您需要做一些工作。最简单的方法是使这项工作是Tnew声明中给出约束BaseClass

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>调用。

于 2013-03-08T05:43:07.863 回答
1

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

于 2013-03-08T05:39:43.230 回答