Dom*_*ogt 1 c# inheritance createinstance activator extending
我有一个基类,如下所示:
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);
}
Run Code Online (Sandbox Code Playgroud)
而且我还有一个扩展这个类的子类。
class DienstGruppe : Data
{
protected override void SetVariables(){
varNames = new String[] {"id", "name"};
parseInduction = "DienstGruppen = {";
parseEnd = "};";
beginOfDataLine = "<";
endOfDataLine = ">";
noise = new String[] { "\"" };
}
}
Run Code Online (Sandbox Code Playgroud)
我尝试使用 Activator.CreateInstance() 函数创建一个对象,如下所示:
Data myData = (Data)Activator.CreateInstance(this.GetType(), new object[] { line });
Run Code Online (Sandbox Code Playgroud)
注意:this.GetType() 用于扩展类在Data的函数中,获取当前类的Type。
但这会导致一个问题。奇怪的是,我收到一个错误,该类(在我的情况下是 DienstGruppe)没有构造函数。我猜 c# 中的继承与 java 中的继承不一样。那么我该如何解决这个问题呢?
不过,它适用于“数据”。
问候, 多米尼克
除了 Pavel 的答案(关于在子类中要求具有适当签名的构造函数是正确的)之外,可能值得指出您为什么需要这样做。
在 C# 中,Section 1.6.7.1根据 C# 语言规范,构造函数不是继承的。
与其他成员不同,实例构造函数不是继承的,并且一个类除了在类中实际声明的构造函数之外没有其他实例构造函数。如果没有为类提供实例构造函数,则自动提供一个没有参数的空构造函数。
您似乎认为继承在 C# 中的工作方式与 Java 不同,但在这种情况下,Java 的行为方式相同。请参阅Section 8.8Java 规范。
构造函数声明不是成员。它们永远不会被继承,因此不会被隐藏或覆盖。
有关此决定背后可能的推理的更多信息,请参阅此 StackOverflow 问题。