基本クラスのコンストラクターを宣言して、サブクラスがそれらを宣言せずに使用できるようにする方法は?
-
28-10-2019 - |
質問
サブクラスに親のコンストラクターを使用してもらいたいです。しかし、それが機能するためには、私は常にサブクラスでそれらを再び定義する必要があるようです:
public SubClass(int x, int y) : base (x, y) {
//no code here
}
それで、私は親クラスでコンストラクターを適切に宣言していないのか、それとも直接的なコンストラクターの継承がまったくないのか疑問に思っていますか?
解決
あなたは何も悪いことをしていません。
C#では、インスタンスコンストラクターが継承されないため、継承タイプでそれらを宣言し、ベースコンストラクターへの連鎖が正しい方法です。
スペック§1.6.7.1から:
他のメンバーとは異なり、インスタンスコンストラクターは継承されておらず、クラスにはクラスで実際に宣言されたもの以外のインスタンスコンストラクターはありません。クラスにインスタンスコンストラクターが提供されていない場合、パラメーターのない空のコンストラクターが自動的に提供されます。
他のヒント
私はこれがあなたの質問に直接答えないことを知っています。ただし、ほとんどのコンストラクターが以前のコンストラクターに新しいパラメーターを導入するだけの場合、オプションの引数(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)
{ }
}
そして、それでも両方を初期化することができます BaseClass
と DerivedClass
任意の数の議論があります:
var d1 = new DerivedClass();
var d2 = new DerivedClass(42);
var d3 = new DerivedClass(42, 43);
コンストラクターは、基本クラスから派生まで継承されていません。各コンストラクターは、最初にベースクラスCTORを呼び出す必要があります。コンパイラは、パラメーターレスCTORを呼び出す方法のみを知っています。ベースクラスにそのようなCTORがない場合は、手動で呼び出す必要があります。
だから、私は親クラスでコンストラクターを適切に宣言していないのではないかと思っています。
基本クラスにデフォルトのコンストラクターがない場合は、チャイルドクラスでそれを再作成する必要があります。それが.NETでのOOPの動作です。