2010-11-28 21 views
32

私はそれから派生するいくつかのクラスを持つ基本クラスの文字を持っています。基本クラスにはさまざまなフィールドとメソッドがあります。C# - すべての派生クラスを基本クラスのコンストラクタを呼び出す

私の派生クラスのすべての同じ基底クラスのコンストラクタを使用しますが、私は私の派生クラスで、コンストラクタを再定義していない場合、私はエラーを取得する:

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

コンストラクタが変更された場合、誤解を許すすべてのクラスで変更する必要があるため、すべての派生クラスでコンストラクタを再定義する必要はありません。一度だけコードを書く考え?

+1

と子クラスを作成することができますか一般に、インスタンシエーションメンバー以外の作業はコンストラクターで行うべきではありません。 – alexn

+0

はいメンバーをインスタンス化するだけです。基本クラスには、すべての派生クラスが使用する5つのフィールドがあります。そのため、これらをコンストラクター引数として渡し、基本クラスフィールドを設定するだけです。 – Tom

+0

類似しているが重複していない:http://stackoverflow.com/q/12051/492 –

答えて

43

あなたはが持っている:あなたは、次のページでは、コンストラクタの詳細情報を見つけることができ

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 } 

それらが効果的に継承されないので、コンストラクタを再宣言すること。コンストラクタがいくつかの点で静的メソッドのように少しあると考えると意味があります。特に

、あなたはすべてのコンストラクタが自動的に継承されたくないう - 結局、自分自身が行うobjectとして、すべてのクラスはパラメータなしのコンストラクタを持っているだろうことを意味するという。

基本クラスのコンストラクタを呼び出すだけなら、コンストラクタの本体にコードを書く必要はありません。引数をWaleedの投稿に従って基本クラスまで渡すだけです。

基本クラスでより多くの情報が必要になった場合は、の情報をに入力する必要があるため、すべての派生クラス(実際にはこれらのクラスのコンストラクタを呼び出すすべてのもの)を変更する必要があります。私はそれが痛みのように見えることは知っていますが、それは単にコンストラクターが行う自然な結果です。

55

は、あなたはそれから派生クラスから基底クラスのコンストラクタを呼び出すために、次の構文を使用することができます。

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

これがあれば、それは、任意の追加のステートメントを実行しますが、最初の基本コンストラクタを呼び出します、このコンストラクタで生成されます。基本コンストラクタが引数を取る場合、あなたがこれを行うことができ

注:

http://msdn.microsoft.com/en-us/library/ms173115%28VS.80%29.aspx

+0

回答ありがとう: – Tom

+0

@ user491704幸い –

+2

public DerivedClass():base(){}、redundant baseコンストラクタコール –

1

代替の一種は、オブジェクトを初期化するためにDependency Injectionコンテナに依存することができます。ベースクラスへの参照(ベースコンストラクタまたは別のイニシャライザメソッドへの呼び出し)が「外部化」されます。 DIコンテナ。

私はそれがあなたのケースか

4

に理にかなっている場合、私は同じ問題を抱えていた、と私はこのようなファクトリメソッドで私のコンストラクタを置き換えることによってそれを解決したか分からない:

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);

+0

これはなぜこの質問に対する答えではありませんか?すべての子クラスの空のコンストラクタ 'public Child(int number):base(number){}'を置き換えます。 – jasdefer

+0

@Benが答えを編集する前は、「私は同じ問題を抱えています」というようなものでした。私は最初のコメントを丁寧に撤回する。 –

+0

ああ、あなたは正しいです。それは本当にそのように聞こえました。あなたの発言をありがとう。 – jasdefer