从具有参数的“Form”inheritance

我有一个名为ScanFolder的表单,我需要另一个表单,它需要与ScanFolder非常相似,所以我决定使用表单inheritance 。 但是构造函数似乎存在一些误解。

ScanFolder看起来像:

 public partial class ScanFolder : Form { public ScanFolder(MainForm parent, bool[] autoModes, GlobalMethods GMethodsClass) { //Doing something with parameters } } 

我试图像这样inheritanceForm

 public partial class Arch2 : ScanFolder { } 

但我收到警告未找到类型’mhmm.ScanFolder’的构造函数,并且Arch2表单编辑模式也出现错误,我看到调用堆栈错误。

所以我尝试过这样的事情:

 public partial class Arch2 : ScanFolder { public Arch2(MainForm parent, bool[] autoModes, GlobalMethods GMethodsClass) : base(parent, autoModes, GMethodsClass) { } } 

但它仍然是一样的。

如你所见,我显然不知道自己在做什么。 我想要实现的是让Arch2看起来与ScanFolder相同,所以我可以在设计器视图中看到它并覆盖一些方法或事件处理程序。

要使用Forms设计器,您需要具有无参数构造函数:

 public partial class ScanFolder : Form { public ScanFolder() { InitializeComponent(); // added by VS } public ScanFolder(MainForm parent, bool[] autoModes, GlobalMethods gm) : this() // <-- important { // don't forget to call the parameterless ctor in each // of your ctor overloads } } 

或者,如果你真的需要一些init参数,你可以反过来做:

 public partial class ScanFolder : Form { public ScanFolder() : this(null, new bool[0], new GlobalMethods()) { } public ScanFolder(MainForm parent, bool[] autoModes, GlobalMethods gm) { InitializeComponent(); // added by VS // other stuff } } 

我推荐第一种方法,否则你需要传递一些合理的默认参数(我不建议传递一个null参数)。

在某些情况下,您似乎还必须在更改类后重新启动Visual Studio。

您可以在父表单中使用此代码:

 public partial class ScanFolder : Form { public ScanFolder(MainForm parent, bool[] autoModes, GlobalMethods GMethodsClass) { //doing something with parameters } } 

然后以子forms:

 public partial class ScanFolder : Form { public ScanFolder(MainForm parent, bool[] autoModes, GlobalMethods GMethodsClass) : base(parent,autoModes,GMethodsClass) { //doing something with parameters } }