2012-08-24 53 views
0

我有一个基类,其是如下:C#激活的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 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()是数据的函数由延伸类使用,获取当前类的类型。

但是,这会导致一个问题。 Bizzarly我得到一个错误,该类(在我的情况下DienstGruppe)没有构造函数。我猜遗传在c#中和java中不一样。那我该如何解决这个问题呢?

它为“数据”虽然。

问候,多米尼克

+0

什么是确切的错误信息? – Jetti

+1

变量'line'的类型是什么?您必须确保参数列表和类型匹配。 – MgSam

+0

我认为已经有了Pavel应该解决的答案。 线是一个字符串。 –

回答

2

你应该DienstGruppe写构造函数从基类继承这样的:

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

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

2

除了由帕维尔,大约需要在子类的适当签名的构造正确的答案,它可能是值得指出的是,为什么你需要做到这一点。

在C#,构造不被继承,具体根据C#语言规范的Section 1.6.7.1

不同于其他成员,实例构造函数是不可继承和 类具有比实际声明在类 没有其他实例构造函数。如果没有实例构造函数被提供给一个类,那么 将自动提供一个没有参数的空实例。

您似乎认为继承在C#中的工作方式与Java不同,但在这种情况下,Java的行为方式相同。请参阅Java规范中的Section 8.8

构造函数声明不是成员。它们永远不会被继承,因此不会被隐藏或压倒一切。

有关这一决定的背后可能推理的更多信息,请参阅this StackOverflow question.