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

派生クラスの新しいインスタンスを作成するたびに、基本クラスのコンストラクターが暗黙的に呼び出されます。あなたのコードでは、

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
}

コンパイラによって。

詳細については、C# コンストラクターに関する Jon Skeet の詳細なブログ記事を参照してください。

于 2012-06-02T18:08:12.653 に答える
8

オブジェクトを作成すると、すべてのコンストラクターが呼び出されます。最初に、基本クラスのコンストラクターがオブジェクトを構築して、基本メンバーが初期化されるようにします。その後、階層内の他のコンストラクターが呼び出されます。

この初期化では、データ メンバーがない場合に抽象基本クラス イベントのコンストラクターを呼び出す意味があるように、静的関数を呼び出すことができます。

于 2012-06-02T18:06:02.820 に答える
2

派生クラスでは、基本クラスのコンストラクターが base キーワードを使用して明示的に呼び出されない場合、既定のコンストラクターがあれば、それが暗黙的に呼び出されます。

msdnからも、ここで 読むことができます

于 2012-06-02T18:08:34.213 に答える