2012-02-28 14 views
5

私は、基本オブジェクトに構成オブジェクトを持ち、そのプロパティに値を渡すコンストラクタを持つクラスのセットを持っています。親コンストラクタを暗黙的に呼び出す

abstract class A { public A(ObjType MyObj){} } 
abstract class B : A {} 
class C : A {} 
class D : B {} 
class E : B {} 

それは暗黙的に子クラスからデフォルト以外のベースのコンストラクタを呼び出すことは可能ですか私は明示的にコンストラクタ経由でそれを行うにはチェーンを署名を実装する必要があるでしょうか?

abstract class A { public A(ObjType MyObj){} } 
abstract class B : A { public A(ObjType MyObj) : base(MyObj){} } 
class C : A { public A(ObjType MyObj) : base(MyObj){} } 
class D : B { public A(ObjType MyObj) : base(MyObj){} } 
class E : B { public A(ObjType MyObj) : base(MyObj){} } 

この場合、ベースにメソッドを実装してから、オブジェクトを作成した後に直ちにメソッドを呼び出すことができますか?

答えて

4

暗黙的に?いいえ、コンストラクタは継承されません。あなたのクラスはと明示的にと呼ばれ、親のコンストラクタと呼ばれます。しかし、あなたのクラスが親クラスと同じコンストラクタシグネチャを持つようにするには、それらを実装する必要があります。例えば

public class A 
{ 
    public A(int someNumber) 
    { 
    } 
} 

// This will not compile becase A doesn't have a default constructor and B 
// doesn't inherit A's constructors. 
public class B : A 
{ 
} 

あなたは明示的にBを持ちたいコンストラクタを宣言する必要があると思い、この作品を作り、それらを明示的にAのコンストラクタを呼び出すようにするには(Aコースのデフォルトコンストラクタを持っていない限り) 。

public class B : A 
{ 
    public B(int someNumber) : base(someNumber) 
    { 
    } 
} 
+0

それは私が(控えめに)恐れていたものでした。私はヘルパーメソッドのルートに行くと思う。ありがとう! –

1

はありません、それがデフォルト以外のベースのコンストラクタ暗黙的を呼び出すことはできません、あなたはそれが明示的に確認する必要があります。

1

チェーンの上に明示的に実装する必要があります。また、元のコードでは、Aにデフォルトのコンストラクタがなく、Bはargを持つAのコンストラクタを呼び出さないため、new B()を呼び出すことはできません。

+0

ありがとう、申し訳ありませんが、簡潔さのためにデフォルトのコンストラクタは省略されています。 –

関連する問題