C#Activator createInstance用于扩展类

时间:2012-08-24 16:20:38

标签: 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 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);
    }

我还有一个Sub Class扩展了这个类。

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。

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

虽然适用于“数据”。

此致,Dominik

2 个答案:

答案 0 :(得分:4)

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

在C#中,根据C#语言规范的Section 1.6.7.1,构造函数不会被继承。

  

与其他成员不同,实例构造函数不是继承的,而是   class没有实际声明的实例构造函数   在课堂里。如果没有为类提供实例构造函数,那么   自动提供没有参数的空的。

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

  

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

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

答案 1 :(得分:2)

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

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

因此它需要子类中的构造函数。