.NET:从MyControl for Windows.Forms继承

时间:2009-10-07 10:32:30

标签: c# .net user-interface

我想为我的所有控件和表单添加一些自定义功能。我已经创建了一个MyControl类,只是这样做没有问题:

MyControl : Control

然后让我的控件从MyControl继承。

但是,我希望我的表单具有相同的功能,并且因为Form继承自ContainerControl,Scrollable Container和THEN Control,我必须创建自己的所有这些版本以使其使用MyControl,这似乎效率低下

这有什么办法吗?我不能使用接口,我不想创建一个名为MyForm的类的副本,其功能与MyControl相同

5 个答案:

答案 0 :(得分:2)

您正在寻找的是多重继承(在.net,with no plans to change that中不存在)或默认接口实现,也就是DII(可能存在于.net的未来版本中)< / p>

截至今天,很遗憾没有解决这个问题的最佳解决方案,最好的办法是创建两个基类。但是,您可以在第三个帮助程序类中共享代码,以便只复制粘合代码,而不是实际的实现。

根据您尝试实现的功能,另一种有用的技术是创建一个类,在其构造函数中传递一个对象(Form或Control),并添加您想要的额外功能。但是,您将无法以这种方式访问​​受控制/表单受保护的成员。

Here是一个讨论您问题的链接。

答案 1 :(得分:1)

由于不支持多重继承,因此您的选择不多。

  1. 在Control

  2. 上使用扩展方法
  3. 在MyForm中重新实现你在MyControl中所做的一切。

  4. 对于2.你可以创建一个接口,比如IMyControl,以及一个实现它的助手类,比如MyHelperControl : IMyControl。然后在MyControlMyForm实现IMyControl但使用私有MyHelperControl并将所有接口成员映射到此助手的调用,这样您只需要管理一个真实代码。

    interface IMyControl {
        void A();
    }
    
    class MyHelperControl : IMyControl {
        void A() {
            // your implementation here
        }
    }
    
    class MyControl : Control, IMyControl {
        private MyHelperControl _myHelper;
        void A() {
            _myHelper.A();
        }
    }
    
    class MyForm : Form, IMyControl {
        private MyHelperControl _myHelper;
        void A() {
            _myHelper.A();
        }
    }
    

答案 2 :(得分:1)

您可以做的一件事是让您的表单继承自包含MyControl实例的自定义“主”表单,如下所示:

public partial class MasterForm : Form
{
    private MyControl _MyControl = new MyControl();

    public MasterForm()
    {
        InitializeComponent();
    }

    public void Method1()
    {
        _MyControl.Method1();
    }
}

这意味着复制MasterForm中的所有MyControl方法签名(或者至少在表单中需要的所有方法签名),但至少方法代码本身不会重复。

public partial class Form1 : MasterForm
{
    public Form1()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        Method1();
    }
}

这种方法避免使用界面,虽然我很好奇为什么无法在这里使用界面。

答案 3 :(得分:0)

我认为唯一的方法是使用

MyForm : Form

也许使用接口和扩展方法尽可能减少代码重复。

答案 4 :(得分:0)

如果您只想添加额外的方法,则可以创建扩展方法,这些方法似乎是某个对象的一部分,但不是。

您可以声明如下:

void MyMethod(this Control obj, string foobar);

然后,您可以将此方法称为Control类的任何其他方法:

myButton.MyMethod("baz");

但是,如果您希望覆盖虚拟方法,请使用类的内部等,那么我无法帮助您。