【问题标题】:Defining a Winform as abstract do not allow editing the UI of the derived Winforms [duplicate]将 Winform 定义为抽象不允许编辑派生 Winform 的 UI [重复]
【发布时间】:2016-02-08 12:57:20
【问题描述】:

我有一个基本的 winform 和 2 个派生的 winform。 基本的 winform 包含标签、文本框和保存按钮。 每个派生类都包含额外的标签和文本框。 SaveButton_Click 事件正在调用 Save 方法。我在基类中将 Save 方法定义为抽象,因此我还将基础 winform 定义为抽象。

这是我的代码:

public abstract partial class BaseRowInfo : Form
{
    public BaseRowInfo()
    {
        InitializeComponent();
    }

    private void SaveButton_Click(object sender, EventArgs e)
    {
        Save();
    }

    protected abstract void Save();
}

public partial class EditableRowInfoFrm : BaseRowInfo
{
    public EditableRowInfoFrm():base()
    {
        InitializeComponent();            
    }

    protected override void Save()
    {
        // TODO
    }
}

public partial class ReadOnlyRowInfoFrm : BaseRowInfo
{
    public ReadOnlyRowInfoFrm ():base()
    {
        InitializeComponent();            
    }

    protected override void Save()
    {
        // TODO
    }
}

一旦我将基类定义为抽象类,我就无法再编辑派生表单的 UI。 我将基类定义为抽象的事实是错误的吗?如果可以将其定义为抽象,解决方案是什么?

【问题讨论】:

    标签: c# winforms inheritance abstract


    【解决方案1】:

    不,您的方法没有任何问题。 Visual Studio IDE 只是不喜欢你在编辑器中使用抽象类。

    我可以从微软的角度理解这很难实现。你冒着改变基类的风险。我不确定他们将如何实现能够以体面的方式工作的设计器。

    有两种选择:

    • 为每个派生类手动编写 UI 代码;
    • 添加一个控件,可能实现一个通用的通信接口,您可以将其添加到您的派生表单中。可以使用设计器创建该控件。

    【讨论】:

    • 第一个选项会很痛苦。您能否强调第二个选项,我不太清楚。谢谢
    • 如果你有一个页脚部分,例如你需要在其中放置一些额外的控件,你可以将它们放在一个控件中,以后可以通过代码将其添加到派生类中。这将最大限度地减少手动编码的需要。
    • 更像是添加新按钮、文本框、更改属性、颜色、字体等。我希望在显示表单而不是通过代码时这样做。每次更改都需要运行应用程序,以确保这是我正在寻找的预期外观。
    • 只有类的抽象性才是设计师的问题。它尝试创建一个类的instance,并在它不能这样做时进行轰炸。因此,如果您绝对想使用设计器(我不再为它烦恼,手工编码同样容易),那么您唯一的选择就是妥协您的设计。使类非抽象,并简单地给它空虚方法。完成设计后,您可以再次将其抽象化。
    【解决方案2】:

    如果您希望能够在派生类中编辑抽象类的 UI 控件,请将这些控件标记为“受保护”访问修饰符而不是“私有”。

    【讨论】:

    • 不是这样,谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多