C# 用于扩展类的C Activator createInstance

C# 用于扩展类的C Activator createInstance,c#,inheritance,activator,extending,createinstance,C#,Inheritance,Activator,Extending,Createinstance,我有一个基类,如下所示: public Data() { id = num++; SetVariables(); } //fill every Variable varNames, parseInduction, noise, seperator in Children Classes public Data(String line) { //first declare all variables in su

我有一个基类,如下所示:

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);
    }
Data myData = (Data)Activator.CreateInstance(this.GetType(), new object[] { line });
我还有一个子类扩展这个类

class DienstGruppe : Data
{
    protected override void SetVariables(){
        varNames = new String[] {"id", "name"};
        parseInduction = "DienstGruppen = {";
        parseEnd = "};";
        beginOfDataLine = "<";
        endOfDataLine = ">";
        noise = new String[] { "\"" };
    }
}
注意:扩展类在数据函数中使用this.GetType来获取当前类的类型

但这会引起一个问题。奇怪的是,我得到了一个错误,在我的例子中,DienstGruppe类没有构造函数。我猜继承在c语言中和java语言中是不一样的。那么我该如何解决这个问题呢

不过,它适用于数据


关于Dominik,您应该在DienstGruppe中编写构造函数以从基类继承它,如下所示:

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

所以它需要子类中的构造函数。

您应该在DienstGruppe中编写构造函数,以便从基类继承它,如下所示:

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

因此,它需要在子类中使用构造函数。

除了Pavel的答案(关于要求在子类中使用具有适当签名的构造函数是正确的)之外,还需要指出为什么需要这样做

根据C语言规范第1.6.7.1节,在C语言中,构造函数不是继承的

与其他成员不同,实例构造函数不是继承的,并且 类除了实际声明的实例构造函数外,没有其他实例构造函数 在课堂上。如果没有为类提供实例构造函数,则 将自动提供一个没有参数的空值

您似乎认为继承在C中的工作方式与Java不同,但在本例中,Java的工作方式是相同的。请参阅Java规范中的第8.8节

构造函数声明不是成员。他们永远不会被继承和保护 因此,不受隐藏或覆盖的约束


有关此决定背后可能的原因的更多信息,请参见Pavel的答案,Pavel的答案是正确的,它要求在子类中使用具有适当签名的构造函数,值得指出您需要这样做的原因

根据C语言规范第1.6.7.1节,在C语言中,构造函数不是继承的

与其他成员不同,实例构造函数不是继承的,并且 类除了实际声明的实例构造函数外,没有其他实例构造函数 在课堂上。如果没有为类提供实例构造函数,则 将自动提供一个没有参数的空值

您似乎认为继承在C中的工作方式与Java不同,但在本例中,Java的工作方式是相同的。请参阅Java规范中的第8.8节

构造函数声明不是成员。他们永远不会被继承和保护 因此,不受隐藏或覆盖的约束


有关此决定背后可能的原因的更多信息,请参见

确切的错误消息是什么?变量行的类型是什么?你必须确保参数列表和类型匹配。我认为Pavel已经给出了一个答案,可以解决这个问题。行是字符串。确切的错误消息是什么?变量行的类型是什么?你必须确保参数列表和类型匹配。我认为Pavel已经给出了一个答案,可以解决这个问题。行是一个字符串。