我有一个asbtract类示例。另一个泛型类UsesExample使用它作为约束,使用new()约束。稍后,我创建一个子类到Example类,ExampleChild,并将其与泛型类一起使用。但不知何故,当泛型类中的代码尝试创建新副本时,它不会调用子类中的构造函数,而是调用父类中的构造函数。为什么会这样? 这是代码:
abstract class Example {
public Example() {
throw new NotImplementedException ("You must implement it in the subclass!");
}
}
class ExampleChild : Example {
public ExampleChild() {
// here's the code that I want to be invoken
}
}
class UsesExample<T> where T : Example, new() {
public doStuff() {
new T();
}
}
class MainClass {
public static void Main(string[] args) {
UsesExample<ExampleChild> worker = new UsesExample<ExampleChild>();
worker.doStuff();
}
}
答案 0 :(得分:8)
当你创建一个对象时,会调用所有构造函数。首先,基类构造函数构造对象,以便初始化基本成员。稍后将调用层次结构中的其他构造函数。
这个初始化可能会调用静态函数,因此如果它没有数据成员,则调用抽象基类事件的构造函数是有意义的。
答案 1 :(得分:8)
每当您创建派生类的新实例时,都会隐式调用基类的构造函数。在您的代码中,
public ExampleChild() {
// here's the code that I want to be invoked
}
真的变成了:
public ExampleChild() : base() {
// here's the code that I want to be invoked
}
由编译器。
您可以阅读有关Jon Skeet关于C#构造函数的详细blog帖子的更多信息。
答案 2 :(得分:2)