-->

C#激活的createInstance用于扩展类(C# Activator createInstan

2019-10-17 04:11发布

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

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相同。 那么,如何解决这个问题?

它适用于“数据”虽然。

问候,多米尼克

Answer 1:

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

在C#,构造不被继承,如每Section 1.6.7.1的C#语言规范的。

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

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

构造函数声明不是成员。 他们从来没有继承,因此不受隐藏或覆盖。

关于这个决定背后可能推理的更多信息,请参阅该StackOverflow的问题。



Answer 2:

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

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

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



文章来源: C# Activator createInstance for extending class