3

サブクラスで親のコンストラクタを使用したい。私は親クラスで適切にコンストラクタを宣言していないよのであれば、私は思ったんだけどサブクラスで宣言せずにコンストラクタを使用できるように、コンストラクタを基底クラスで宣言するにはどうすればよいですか?

public SubClass(int x, int y) : base (x, y) { 
    //no code here 
} 

、または:しかし、私はいつものように、仕事に、そのためには、サブクラスで再びそれらを定義する必要がありそうです直接コンストラクタの継承は全くありませんか?

+0

[コンストラクタの継承方法](http:// stackove rflow.com/questions/223058/how-to-inherit-constructors) –

+0

あなたがしていることは正確に正しいです。コンストラクタは継承されません。新しいサブクラスごとに再宣言する必要があります。 –

答えて

9

あなたは間違ったことはしていません。

C#では、インスタンスコンストラクタは継承されないため、継承型で宣言し、ベースコンストラクタに連鎖することが正しい方法です。スペック§1.6.7.1から

:他のメンバーとは異なり

は、インスタンスコンストラクタは継承されません、そしてクラスが実際にクラスで宣言されたもの以外のインスタンスコンストラクタを持っていません。クラスにインスタンスコンストラクタが指定されていない場合、パラメータのない空のコンストラクタが自動的に提供されます。

1

私は 親クラスで適切にコンストラクタを宣言していないよ場合、これは愚かなようですので、だから私は、思ったんだけど。

基本クラスにデフォルトのコンストラクタがない場合は、子クラスに再宣言する必要があります。 OOPが.NETでどのように動作するか

3

コンストラクタは、基底クラスから派生して継承されません。各コンストラクタは、基本クラスctorを最初に呼び出す必要があります。コンパイラは、パラメータのないctorの呼び出し方法しか認識していません。基本クラスにこのようなctorがない場合は、手動で呼び出す必要があります。

4

これはあなたの質問に直接答えるものではありません。しかし、コンストラクタの大半が前のコンストラクタに新しいパラメータを導入するだけの場合は、オプションの引数(C#4で導入されている)を利用して、定義するコンストラクタの数を減らすことができます。例えば

public class BaseClass 
{ 
    private int x; 
    private int y; 

    public BaseClass() 
     : this(0, 0) 
    { } 

    public BaseClass(int x) 
     : this(x, 0) 
    { } 

    public BaseClass(int x, int y) 
    { 
     this.x = x; 
     this.y = y; 
    } 
} 

public class DerivedClass : BaseClass 
{ 
    public DerivedClass() 
     : base() 
    { } 

    public DerivedClass(int x) 
     : base(x) 
    { } 

    public DerivedClass(int x, int y) 
     : base(x, y) 
    { } 
} 

以上に減少させることができます。

public class BaseClass 
{ 
    private int x; 
    private int y; 

    public BaseClass(int x = 0, int y = 0) 
    { 
     this.x = x; 
     this.y = y; 
    } 
} 

public class DerivedClass : BaseClass 
{ 
    public DerivedClass(int x = 0, int y = 0) 
     : base(x, y) 
    { } 
} 

そして、それはまだあなたが任意の数の引数でBaseClassDerivedClassの両方を初期化することが可能になります。

var d1 = new DerivedClass(); 
var d2 = new DerivedClass(42); 
var d3 = new DerivedClass(42, 43); 
関連する問題