如何正确扩展WinForms

时间:2015-07-09 05:29:38

标签: c# winforms oop constructor

常规C#Windows窗体看起来像这样(非设计器代码):

public partial class BaseForm : Form
{
    public BaseForm()
    {
        // v--- very important method, it is what initializes the form
        InitializeComponent();
    }

    public BaseForm(string title)
        : this() // chain with the main constructor
    {
        this.Text = title;
    }
}

现在让我们创建一个派生形式:

public partial class EntityForm : BaseForm
{
    public EntityForm()
        : base()
    {
    }

    public EntityForm(Entity entity)
        : base(entity.Name)
    {
    }
}

第二种形式停止正常工作。调用InitializeComponent();时,它是在BaseForm的上下文中完成的(因为它始终被定义为不可重写和私有)。

乍一看,解决方案可能是在每个构造函数中都有InitializeComponent();,但这意味着可能被多次调用,不必要地创建对象(因为构造函数链接)。 解决这个问题的方法可能是将它作为一般而不是调用基础构造函数来破坏OOP的目的。

我做错了什么?有什么想法吗?

1 个答案:

答案 0 :(得分:1)

一个有点优雅的可能解决方案是根本不将参数传递给构造函数 - 也就是说,只让一个无参数构造函数调用InitializeComponent(),这是任何自定义控件的默认值。 然后我需要第二种方法来实际设置控件。可以根据需要覆盖此方法。

原始来源的示例修复:

public partial class BaseForm : Form
{
    public BaseForm()
    {
        InitializeComponent();
    }

    public virtual void Initialize(string title)
    {
        this.Text = title;
    }
}

public partial class EntityForm : BaseForm
{
    public EntityForm()
    {
        InitializeComponent();
    }

    public virtual void Initialize(Entity entity)
    {
        base.Initialize(entity.Name); // the 'base' keyword is somewhat redundant
    }
}