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已经给出了一个答案,可以解决这个问题。行是一个字符串。