从具有参数的"Form"继承

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.