我想为我的所有控件和表单添加一些自定义功能。我已经创建了一个MyControl类,只是这样做没有问题:
MyControl : Control
然后让我的控件从MyControl继承。
但是,我希望我的表单具有相同的功能,并且因为Form继承自ContainerControl,Scrollable Container和THEN Control,我必须创建自己的所有这些版本以使其使用MyControl,这似乎效率低下
这有什么办法吗?我不能使用接口,我不想创建一个名为MyForm的类的副本,其功能与MyControl相同
答案 0 :(得分:2)
您正在寻找的是多重继承(在.net,with no plans to change that中不存在)或默认接口实现,也就是DII(可能存在于.net的未来版本中)< / p>
截至今天,很遗憾没有解决这个问题的最佳解决方案,最好的办法是创建两个基类。但是,您可以在第三个帮助程序类中共享代码,以便只复制粘合代码,而不是实际的实现。
根据您尝试实现的功能,另一种有用的技术是创建一个类,在其构造函数中传递一个对象(Form或Control),并添加您想要的额外功能。但是,您将无法以这种方式访问受控制/表单受保护的成员。
Here是一个讨论您问题的链接。
答案 1 :(得分:1)
由于不支持多重继承,因此您的选择不多。
在Control
在MyForm中重新实现你在MyControl中所做的一切。
对于2.你可以创建一个接口,比如IMyControl
,以及一个实现它的助手类,比如MyHelperControl : IMyControl
。然后在MyControl
和MyForm
实现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");
但是,如果您希望覆盖虚拟方法,请使用类的内部等,那么我无法帮助您。