【问题标题】:Can a C# base class call a sub class's constructor in a static member?C# 基类可以在静态成员中调用子类的构造函数吗?
【发布时间】:2013-03-08 05:37:33
【问题描述】:

我有一个抽象的通用类“BaseClass”和一个这样定义的类“SubClass”:

public class SubClass : BaseClass<SubClass>

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

public static T GetSub() 

然后在子类上调用 this 使其返回子类的一个实例

SubClass sub = SubClass.GetSub();

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

这似乎有点疯狂,但我至少很想知道这是否可能。当谈到 C# 更复杂的 OOP 功能时,我还是个新手,所以我真的只是在黑暗中摸索。

【问题讨论】:

  • return new SubClass()(并添加通用约束 new() 以指定类型参数是可实例化的)。

标签: c# oop


【解决方案1】:

可以完成这项工作,但需要您做一些工作。最简单的方法是让TBaseClass 的声明中赋予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&lt;T&gt; 方法只会寻找一个无参数的构造函数并调用它。事实上,new T() 调用通常会编译为Activator.CreateInstance&lt;T&gt; 调用。

【讨论】:

  • 很棒的东西。非常感谢。
【解决方案2】:

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

【讨论】:

  • 我认为反思是必要的,我愿意使用它。我真的想要一种方法来构建这些只在基类中定义的对象。
  • 那么,GetType() 和 Activator.CreateInstance() 就是你要走的路。
  • 这里如何使用GetType?我用不同的方法用 GetType 做类似的事情,但它们不是静态的,我正在做 this.GetType()。这是静态的,所以没有这个。
  • 然后,您可以使用泛型方法(如另一个答案中所建议),并使用 typeof(T)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多