【问题标题】:Windows Form inheritanceWindows 窗体继承
【发布时间】:2009-05-05 19:01:39
【问题描述】:

我想创建一堆具有相同属性的表单,并通过分配构造函数的参数来初始化表单构造函数中的属性。

我尝试创建一个从表单继承的类,然后让我的所有表单都从该类继承,但我认为由于我无法调用 InitializeComponent(),所以我遇到了一些问题。

关于如何执行此操作的 C# 代码有哪些?

【问题讨论】:

标签: c# .net windows winforms inheritance


【解决方案1】:

应该通过让构造函数调用base() 来调用父级的InitializeComponent,如下所示:

public YourFormName() : base()
{
    // ...
}

(你的父表单应该在其构造函数中调用InitializeComponent。你没有把它拿出来,是吗?)

但是,您要走的路并不适合设计师,因为您无法在设计时使用这些参数来实例化您的表单(您将必须提供一个无参数的构造函数才能工作)。如果您在代码中使用带参数的构造函数,您还会遇到第二次分配父属性或将它们分配为与您可能想要的不同的问题。

坚持只在表单上使用属性,而不是使用带参数的构造函数。对于 Forms,您会很头疼。

【讨论】:

  • 我同意,设计师不支持继承很好。我在相互继承的表单/控件方面遇到了很多问题。设计器有时会崩溃,如果您在其中一个基类中出现错误,我经常需要删除我现有的表单并恢复到以前的版本。虽然它看起来很优雅,但它最终带来的麻烦远远超过了它的价值。
  • 我可能遗漏了一些东西,但是让你的构造函数调用 base() 像这样: public YourFormName() : base() 是多余的,并且是 C# 继承的默认操作。 base() 无论如何都会被隐式调用。否则,我同意你的其余答案,基本上控制继承工作,但在大多数情况下最好处理零参数构造函数,或者确保你的设计时构造函数(零参数)具有适当的默认值。
【解决方案2】:

这里继承的另一种模式是使用工厂来创建表单。这样你的工厂就可以设置所有的属性了

【讨论】:

    【解决方案3】:

    创建一个接口并将其传递给表单的构造函数。

    interface IFormInterface
    {
          //Define Properties here
    }
    
    public MyForm(IFormInterface AClass)
    {
          //Set Properties here using AClass
    }
    

    虽然当我想做这样的事情时,我通常做的不仅仅是设置属性,所以我最终为默认行为创建了一个抽象类。

    【讨论】:

      猜你喜欢
      • 2016-01-11
      • 1970-01-01
      • 1970-01-01
      • 2014-05-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-02
      • 1970-01-01
      相关资源
      最近更新 更多