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() 是由扩展类在Data 的一个函数中使用的,用来获取当前类的Type。

但这会导致一个问题。奇怪的是,我收到一个错误,该类(在我的情况下为 DienstGruppe)没有构造函数。我猜c#中的继承与java中的继承不一样。那么我该如何解决这个问题呢?

它适用于“数据”。

问候, 多米尼克

4

2 回答 2

6

除了 Pavel 的回答(关于在子类中要求具有适当签名的构造函数是正确的)之外,可能值得指出您为什么需要这样做。

Section 1.6.7.1根据C# 语言规范,在 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 回答