1

次のような基本クラスがあります。

public Data()
    {
        id = num++;
        SetVariables();
    }
    //fill every Variable varNames, parseInduction, noise, seperator in Children Classes
    public Data(String line)
    {
        //first declare all variables in sub classes
        if (id == 0)
            throw new NotSupportedException("You are not allowed to use this constructor for creating the first instance!");
        id = num++;
        SetVariables();
        parseLine(line);
    }

また、このクラスを拡張するサブクラスもあります。

class DienstGruppe : Data
{
    protected override void SetVariables(){
        varNames = new String[] {"id", "name"};
        parseInduction = "DienstGruppen = {";
        parseEnd = "};";
        beginOfDataLine = "<";
        endOfDataLine = ">";
        noise = new String[] { "\"" };
    }
}

そして、次のように Activator.CreateInstance() 関数を使用してオブジェクトを作成しようとします。

Data myData = (Data)Activator.CreateInstance(this.GetType(), new object[] { line });

注: this.GetType() は、現在のクラスの Type を取得するために、拡張クラスによって Data の関数で使用されます。

しかし、これは問題を引き起こします。奇妙なことに、クラス (私の場合は DienstGruppe) にコンストラクターがないというエラーが表示されます。C# の継承は Java と同じではないと思います。では、どうすればこの問題を解決できますか?

ただし、「データ」に対しては機能します。

よろしく、 ドミニク

4

2 に答える 2

6

子クラスに適切な署名を持つコンストラクターを要求することについて正しいPavelによる回答に加えて、なぜそれを行う必要があるのか​​を指摘する価値があるかもしれません。

Section 1.6.7.1C#では、C#言語仕様に従って、コンストラクターは継承されません。

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

継承はC#とJavaで異なる動作をするように思われましたが、この場合、Javaは同じように動作します。Section 8.8Java仕様を参照してください。

コンストラクター宣言はメンバーではありません。それらは継承されることはないため、非表示またはオーバーライドの対象にはなりません。

この決定の背後にある考えられる理由の詳細については、このStackOverflowの質問を参照してください。

于 2012-08-24T17:07:42.887 に答える
2

DienstGruppe にコンストラクターを記述して、次のように基本クラスから継承する必要があります。

public DienstGruppe(String line) : base(line) { }

したがって、子クラスにコンストラクターが必要です。

于 2012-08-24T16:24:08.577 に答える