サブクラスがその親のコンストラクターを使用するようにしたい。しかし、それが機能するためには、サブクラスでそれらを再度定義する必要があるようです。
public SubClass(int x, int y) : base (x, y) {
//no code here
}
したがって、親クラスでコンストラクターを適切に宣言していないのか、それともコンストラクターの直接継承がまったくないのか疑問に思っています。
サブクラスがその親のコンストラクターを使用するようにしたい。しかし、それが機能するためには、サブクラスでそれらを再度定義する必要があるようです。
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の仕組みです。