表单继承应该是抽象的

时间:2015-10-01 04:48:58

标签: forms inheritance override abstract

这是我的代码

GeneralLesson.cs :它只是一个.cs文件,没有.Designer.cs或.resx文件

public /*abstract*/ class GeneralLesson : Form
{
    public GeneralLesson()
    {
        this.StartPosition = SS.FrmStartPos;//If I want to change it later, I just change it here and all the children will get the change
    }
    protected override void OnFormClosing(FormClosingEventArgs e)
    {
        base.OnFormClosing(e);
        if (e.CloseReason == CloseReason.WindowsShutDown) return;

        SS.LearningDay = 0; //SS is my static class that hold the static variables.
        SS.FrmMain.Show();
    }
}

SentLesson.cs :这实际上是一个带有.Designer.cs和.resx文件的Windows窗体

public partial class _Sent_Lesson : GeneralLesson
{
    public _Sent_Lesson()
    {
        InitializeComponent();           
        richTextBox1.Text = "under construction";
    }

}

所以它实际上很符合我的目的。我的SentLesson窗口继承了GeneralLesson的构造函数和OnFormClosing。但问题是我无法再设计我的SentLesson窗口了,如下图所示: Object reference not set to an instance of an object.

也许我做错了。但我不想将GeneralLesson创建为Window,因为我没有设计任何控件,我只想覆盖一些函数,如OnFormClosing或Constructor。如果不将GeneralLesson作为一个窗口,我有什么方法可以做到这一点。

感谢阅读。

1 个答案:

答案 0 :(得分:0)

我终于得到了解决方案。即使抽象的父表单仍然在逻辑上工作,但子表单不能用Visual Studio设计器进一步设计。所以我必须以Visual Studio方式继承表单。 enter image description here

如您所见,Visual Studio为我们提供了Inherited Form来创建Children表单。因此,我将GeneralLesson.cs创建为Windows窗体,将SentLesson.cs创建为继承窗体。因此,SentLesson从GeneralLesson继承了构造函数和OnFormClosing,并且SentLesson的设计者不再显示错误。

如果您希望子窗体可以从父窗体访问某些控件,请说父母"按钮A"。只需设置父母"按钮A"属性窗口中的修改器从专用到受保护。然后你可以在儿童表格中使用按钮A做任何事情。

感谢您的阅读。