web-dev-qa-db-ja.com

C#-すべての派生クラスが基本クラスコンストラクターを呼び出すようにする

私はそれから派生するいくつかのクラスを持つ基本クラスのキャラクターを持っています。基本クラスには、さまざまなフィールドとメソッドがあります。

すべての派生クラスは同じ基本クラスコンストラクターを使用しますが、派生クラスでコンストラクターを再定義しないと、エラーが発生します。

エラー:クラス「子クラス」には、この数の引数を取るコンストラクタが含まれていません

すべての派生クラスでコンストラクターを再定義したくないのは、コンストラクターが変更された場合、すべてのクラスでコンストラクターを変更する必要があるためです。

46
Tom

コンストラクターは事実上継承されないため、doコンストラクターを再宣言する必要があります。コンストラクターをいくつかの点で静的メソッドに少し似ていると考えるなら、それは理にかなっています。

特に、すべてのコンストラクターが自動的に継承されることをしたくない-結局、それはクラスには、object自体が持つように、パラメーターのないコンストラクターがあります。

ただし、基本クラスコンストラクターを呼び出すだけの場合は、コンストラクターの本体にコードを記述する必要はありません。Waleedの投稿に従って、引数を基本クラスに渡すだけです。

基本クラスがより多くの情報を必要とするようになった場合、派生クラス(および実際にそれらのクラスのコンストラクターを呼び出すものすべて)を変更する必要があるのは自然です。なぜなら、provide情報。私はそれが苦痛のように思えるかもしれませんが、それはコンストラクタが行うことの自然な結果にすぎません。

45
Jon Skeet

次の構文を使用して、派生クラスから基本クラスコンストラクターを呼び出すことができます。

public DerivedClass() : base() {
    // Do additional work here otherwise you can leave it empty
}

これは最初に基本コンストラクターを呼び出し、次にこの派生コンストラクターで追加のステートメントがあれば実行します。

基本コンストラクタが引数を取る場合、これを行うことができることに注意してください:

public DerivedClass(int parameter1, string parameter2) 
    : base(parameter1, parameter2) {
    // DerivedClass parameter types have to match base class types
    // Do additional work here otherwise you can leave it empty
}

次のページでコンストラクターの詳細を確認できます。

https://docs.Microsoft.com/en-us/dotnet/csharp/programming-guide/classes-and-structs/using-constructors

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

73

私も同じ問題を抱えていたので、コンストラクターを次のようなファクトリーメソッドに置き換えることで解決しました。

Aは親クラスです。

_public static T getChild<T>(int number) where T:A, new()
{
    T child = new T();
    T._number = number;
    return child;

}
_

子クラスを作成するには

Child b = A.getChild<Child>(2);

5
jasdefer

ある種の代替手段は、オブジェクトを初期化するために依存性注入コンテナに依存することです。そうすることで、基本クラスへの参照(基本コンストラクタまたは別の初期化メソッドへの呼び出し)がDIコンテナに「外部化」されます。

それはあなたのケースに意味があるかどうかわかりません

1
t3mujin