2011-10-26 12 views
1

C#で祖父のコンストラクタを呼び出す方法はありますか?C#のマルチレベル継承コンストラクタ

public class A 
{ 
    public A(parameterX x) 
    { 
     doSomething(); 
    } 
} 

public class B : A 
{ 
    public B(parameterX x) : base(x) 
    { 
     doSomethingElse(); 
    } 
} 

そして、私が持っている:

public class C : B 
{ 
} 

をそして私は、私はこのために何を使用することができ、CでのコンストラクタはAでコンストラクタを呼び出したいのは、私が持っているとしましょうか?

public C(parameterX x) : base : base(x) 

またはどのように私はCからAでのコンストラクタを呼び出すことができます。 のようなものはありますか?

ありがとうございました。

+0

なぜなら、BコンストラクタがAを呼び出さないと、Cが呼び出されたときにAが呼び出されるからです。 –

答えて

4

祖父母クラスのコンストラクタを呼び出すことはできません。
しかし、基本クラスはすでにそうしているので、どちらも必要ありません。

public C(parameterX x) : base(x)と書くと、B(x)が呼び出され、A(x)となります。

一般に、基本クラスのコンストラクタは常にその基本コンストラクタ(祖父母)を呼び出すため、祖父母コンストラクタを明示的に呼び出すことはできません。

+0

私は知っていますが、問題は私がここで書いたものより少し複雑です。Bコンストラクタはfooクラスからパラメータを受け取り、Cコンストラクタはクラスバーからパラメータを受け取ります。 Fooとbarは異なりますが、どちらもクラスDを親として持っています。クラスAのコンストラクタは、テンプレートを使用しているので、いずれかのパラメータをとります。だから私はBを通過することはできませんが、Aは自分のパラメータで正常に動作します。 – lander16

+0

いいえ、(直接)基本クラスのコンストラクタを常に呼び出さなければなりません。作成されていないクラスは作成できません。 'protected'コンストラクタを' B'に追加することを検討してください。また、それは悪いデザインのように聞こえる。それをリファクタリングすることを検討してください。 – SLaks

+0

私は保護されたコンストラクタを追加するかもしれません、デザインは最高ではありません、私は仕事のトンを節約するハックの種類と既存の環境に統合しようとしています。ありがとう! – lander16

1

私は実際に何をしようとしているのか分かりませんが、より良い実際のデザインを考え出すことはできますが、おそらくBパラメータに別のコンストラクタを追加することで、しかし、C(bar)を実行するときにA(Bar)コンストラクタを呼び出すだけで何もしません。base(bar)はBに、Aには地獄として行きます。

+0

私はこれを行うかもしれませんが、私は今は仕事のトンを節約しようとしている、悪いデザインであることを知っています。 – lander16

+0

後でもっと仕事をするために自分自身を設定しているかもしれません。 –