4

我有一个抽象类示例。另一个泛型类 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();

    }

}
4

3 回答 3

8

当你创建一个对象时,所有的构造函数都会被调用。首先,基类构造函数构造对象,以便初始化基成员。稍后调用层次结构中的其他构造函数。

此初始化可能会调用静态函数,因此如果抽象基类事件没有数据成员,则调用它的构造函数是有意义的。

于 2012-06-02T18:06:02.820 回答
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# 构造函数的详细博客文章中阅读更多内容。

于 2012-06-02T18:08:12.653 回答
2

在派生类中,如果未使用 base 关键字显式调用基类构造函数,则隐式调用默认构造函数(如果有)。

也来自msdn ,你可以在这里阅读

于 2012-06-02T18:08:34.213 回答