继承抽象类并实现接口(interface)的 C# 窗体。

标签 c# winforms interface abstract-class

我的项目中需要有多个表单类。所以正在考虑将这些形式的所有共同点放在抽象类中。此类将具有继承的 Form 类和一个接口(interface)。诸如此类:

public interface IMyForm
{
void Init();
}

public abstract class AMyForm : Form, IMyForm
{
    void IBrowser.Init()
    {
        throw new NotImplementedException();
    }     
}

public partial class MainClass : AMyForm 
{

// But here the warning is shown (That i have to add override keyword),
// but when i do, The error is shown that i cannot override from non abstract thing 
    public void Init() 
    {
    }
}

你能告诉我如何实现吗?

最佳答案

虽然 Jon Skeets 的回答对于一般编程是正确的,但我建议反对在表单和用户控件上使用抽象类。第一个问题是,设计器无法创建抽象类的实例,因此无法在设计器中显示继承FROM 抽象窗体的窗体。这意味着您将无法通过设计器向窗体添加新控件,除非 - 正如下面评论中所建议的那样 - 您添加了一个实现抽象类的代理类,然后用作其他类的基础继承的形式,例如:AbstractMyForm -> MyFormSurrogate -> MyForm

在我看来,第二个也是更大的问题是,这意味着您正试图将逻辑固定在表单中。这通常是不希望的,尤其是当您最终将业务逻辑与显示技术耦合时,在本例中为 Winforms。我的建议是尝试使用 Model View Presenter pattern在普通类中尽可能多地分离逻辑(使用抽象类、接口(interface)等)然后 data bind他们的形式。如果有共享的可视部分(例如:一组复选框),请为这些部分制作用户控件并在表单上重用它们。

我希望我没有过多地假设您对 winforms 的了解,但当我开始进行 GUI 开发时,我也遇到过类似的问题。

关于继承抽象类并实现接口(interface)的 C# 窗体。,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11508199/

相关文章:

c# - 如何利用 EF 和 LINQ 添加过滤器并动态指定表、列、过滤器和排序依据

c# - 单击富文本框中的链接后如何打开新的浏览器窗口(C#)

c# - 如何为 GraphicsPath 应用外边框

go - 在 Golang 中传递 interface{} 或 []interface{}

c# - Xamarin 窗体可绑定(bind)网格

c# - Graphics.DrawString() 与 TextRenderer.DrawText()

c# - XAML 页面构造函数

c# - 在设计器中创建一个具有固定高度的自定义控件

java - 无法弄清楚如何让 SWIG/Java 强制代理类实现接口(interface)

swift - 类型 '...' 的值在赋值中不符合 '...'