我有一个父类
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)'
答案 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设为私有。