派生类中构造函数的错误

时间:2016-06-30 14:00:41

标签: c# .net inheritance constructor

我有一个父类

abstract class ClassPlugin
{
    public ClassPlugin(eGuiType _guyType)
    {
        GuiType = _guyType;
    }
    public eGuiType GuiType;

    public void Action() { }
}

我希望所有派生类都实现Action成员并定义guyType字段。 要做到这一点,我把它放在构造函数中,这是我想到的唯一方法。 因此抽象类可以是:

class ClassStartWF: ClassPlugin
{
    public ClassStartWF(eGuiType _guyType)
    {
        GuiType = _guyType;
    }

    public void Action()
    {
        MessageBox.Show(GetType().Name);
    }
}

问题是我收到了错误:

  

严重级代码描述项目文件行抑制状态   错误CS7036没有给出对应的参数   必需的形式参数' _guyType'的   ' MainWindow.ClassPlugin.ClassPlugin(MainWindow.eGuiType)'

2 个答案:

答案 0 :(得分:3)

您应该在派生类构造函数中调用基类构造函数。由于您已经创建了构造函数,因此编译器不会为您的类生成默认构造函数。

public ClassStartWF(eGuiType _guyType)
   : base(_guyType)
{
    // GuiType = _guyType; //this is not needed since the value is assigned in the base class constructor
}

答案 1 :(得分:1)

两个问题......

首先,您需要从派生类型调用基类构造函数,因为基类没有默认构造函数:

public ClassStartWF(eGuiType _guyType) : base(_guyType)
{
}

由于基类负责设置字段,因此您不需要这样做。

其次,你应该在基类中使Action抽象,然后在派生类中重写它:

abstract class ClassPlugin
{
    public abstract void Action();
}

class ClassStartWF: ClassPlugin
{
    public ClassStartWF(eGuiType _guyType)
    {
        GuiType = _guyType;
    }

    public override void Action()
    {
        MessageBox.Show(GetType().Name);
    }
}

当您调用Action时,当通过基准引用调用时,不会调度到派生实例。

此外,不是让GuiType成为公共变量,而是让它成为一个属性更好:

public eGuiType GuiType{get; set;}

这将使您可以控制该值。此外,如果只在构造期间设置它,您可能需要考虑将setter设为私有。