在没有视觉派生的情况下如何从另一个派生WinForm?

时间:2018-07-23 06:28:40

标签: c# .net winforms inheritance

我目前正在开发一种用于测试数据采集处理器的多形式程序。

软件本身提供在DAP上执行某些测试的功能。当前,每个测试都有其自己的形式以及相关的方法和属性。但是,由于所有测试在某些情况下都需要使用相同的方法,但是在每种形式中均定义相同,因此目前这是非常多余的。

由于这个问题,我在逻辑上将继承的概念视为一种解决方案。但是,问题在于,当我拥有主表格并从中导出所有其他测试表格时,它们在视觉上也从主表格中导出。但是,我想完全停止这一点。我只需要派生的方法和属性,而不需要视觉派生。

有没有一个概念可以做到这一点?我可以防止调用“ InitializeComponents()”方法吗?还是将主表格标记为“抽象”就足够了吗?

1 个答案:

答案 0 :(得分:2)

从表单派生时,基本表单的构造函数将在子表单中运行。因此,基本上,视觉继承是您在基本表单的构造函数中拥有的代码的结果。

作为一种选择,在决定继续从基本表单派生之前,您可能需要考虑创建业务逻辑类作为方法的容器。如果需要,您可以仅在业务逻辑类之间具有继承链。另外,您可以将业务逻辑类的实例注入表单中,而不是从表单中获取。

但是出于任何原因,如果您更喜欢将表单用作基类,则可以创建基表单类,而无需在基表单中包含任何UI逻辑,这样做就足以创建此类:

[System.ComponentModel.DesignerCategory("")]
public class BaseForm : System.Windows.Forms.Form
{
    //Don't define InitializeComponent
    //Add methods here
}

在上面的类中,没有定义InitializeComponent,也没有通过使用[DesignerCategory("")]来定义该类的设计器,因此您不能在designer中打开它。然后,您可以简单地从该基本形式中得出。

注意:该属性不是强制性的。只是为了防止基本表单打开。如果确定您不会在Designer中打开该表单,则可以将其删除。如果保留它,则默认情况下将禁用子窗体设计器。要启用子表单设计者,只需用[System.ComponentModel.DesignerCategory("Form")]装饰它们即可。