我有一个名为 ScanFolder 的表单,我需要另一个与 ScanFolder 非常相似的表单,所以我决定使用 form inheritance 。但是似乎对构造函数有些误解。
ScanFolder 看起来像:

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

我试图像这样继承 Form:
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 相同,这样我就可以在设计器 View 中看到它,并覆盖一些方法或事件处理程序。

最佳答案

要使用 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
    }
}

或者,如果你真的需要一些初始化参数,你可以反过来做:
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
    }
}

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

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

关于c# - 从具有参数的 'Form' 继承,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5729015/

10-11 20:26
查看更多