C# 如何正确扩展WinForms
常规的C#Windows窗体如下所示(非设计器代码): 现在让我们创建一个派生形式:C# 如何正确扩展WinForms,c#,winforms,oop,constructor,C#,Winforms,Oop,Constructor,常规的C#Windows窗体如下所示(非设计器代码): 现在让我们创建一个派生形式: public partial class EntityForm : BaseForm { public EntityForm() : base() { } public EntityForm(Entity entity) : base(entity.Name) { } } 第二种形式无法正常工作。当初始化组件()时,则在Base
public partial class EntityForm : BaseForm
{
public EntityForm()
: base()
{
}
public EntityForm(Entity entity)
: base(entity.Name)
{
}
}
第二种形式无法正常工作。当初始化组件()时调用code>,则在BaseForm
的上下文中这样做(因为它总是被定义为不可重写和私有的)
乍一看,解决方案可能是使用InitializeComponent()但是,这意味着它可能会被多次调用,从而不必要地创建对象(因为构造函数链接)。
解决这个问题的一个办法是将其视为一种通用方法,即不调用基本构造函数,这有点违背OOP的目的
我做错了什么?有什么想法吗?一个可能的解决方案是完全不向构造函数传递参数,也就是说,只允许一个无参数构造函数调用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
}
}
您的代码示例显示了EntityForm
继承Form
。您确定这是一个实际的工作代码示例吗?如果没有,请发布可靠的重现问题的帖子。嗯,我的错。没错。已修复。无论如何,不调用基构造函数都不是选项。不清楚“第二个表单停止正常工作”是什么意思,但坦率地说,我怀疑它是否与表单继承或InitializeComponent()
方法有关。如果EntityForm
有一个InitializeComponent()
方法,它应该在构造函数中调用该方法。如果没有一个好的代码示例,甚至不可能知道“停止正常工作”是什么意思,更不用说提供一个解决方案了。上面的示例现在应该足够了。引用我自己的话:初始化组件()时;调用时,它是在BaseForm的上下文中执行的(因为它总是定义为不可重写和私有的)。构造函数没有返回类型<代码>公共无效
毫无意义。
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
}
}