and*_*ree 7 .net c# inheritance constructor winforms
我有一个名为Form的表单ScanFolder
,我需要另一个表单,需要非常相似ScanFolder
,所以我决定使用表单继承.但是构造函数似乎存在一些误解.
ScanFolder
好像:
public partial class ScanFolder : Form
{
public ScanFolder(MainForm parent, bool[] autoModes, GlobalMethods GMethodsClass)
{
//Doing something with parameters
}
}
Run Code Online (Sandbox Code Playgroud)
我试图Form
像这样继承:
public partial class Arch2 : ScanFolder
{
}
Run Code Online (Sandbox Code Playgroud)
但是我收到警告未找到类型'mhmm.ScanFolder'的构造函数,并且Arch2
表单编辑模式也出现错误,我看到调用堆栈错误.
所以我尝试过这样的事情:
public partial class Arch2 : ScanFolder
{
public Arch2(MainForm parent, bool[] autoModes, GlobalMethods GMethodsClass)
: base(parent, autoModes, GMethodsClass)
{
}
}
Run Code Online (Sandbox Code Playgroud)
但它仍然是一样的.
如你所见,我显然不知道自己在做什么.我想要实现的是Arch2
看起来一样ScanFolder
,所以我可以在设计器视图中看到它,并覆盖一些方法或事件处理程序.
Gro*_*roo 14
要使用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
}
}
Run Code Online (Sandbox Code Playgroud)
或者,如果你真的需要一些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
}
}
Run Code Online (Sandbox Code Playgroud)
我推荐第一种方法,否则你需要传递一些合理的默认参数(我不建议传递一个null参数).
在某些情况下,您似乎还必须在更改类后重新启动Visual Studio.