3

サブクラスがその親のコンストラクターを使用するようにしたい。しかし、それが機能するためには、サブクラスでそれらを再度定義する必要があるようです。

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

したがって、親クラスでコンストラクターを適切に宣言していないのか、それともコンストラクターの直接継承がまったくないのか疑問に思っています。

4

4 に答える 4

9

あなたは何も悪いことをしていません。

C#では、インスタンスコンストラクターは継承されないため、継承型でインスタンスコンストラクターを宣言し、ベースコンストラクターにチェーンするのが正しい方法です。

仕様§1.6.7.1から:

他のメンバーとは異なり、インスタンスコンストラクターは継承されず、クラスには、クラスで実際に宣言されているもの以外のインスタンスコンストラクターはありません。クラスにインスタンスコンストラクターが指定されていない場合、パラメーターのない空のコンストラクターが自動的に提供されます。

于 2012-01-15T12:10:04.880 に答える
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);
于 2012-01-15T13:15:58.063 に答える
3

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

于 2012-01-15T12:11:54.893 に答える
1

ですから、これはばかげているように見えるので、親クラスでコンストラクターを適切に宣言していないのではないかと思います。

基本クラスにデフォルトのコンストラクターがない場合は、子クラスで再宣言する必要があります。これが、.NETでのOOPの仕組みです。

于 2012-01-15T12:10:17.490 に答える