C# 用户控制多重继承
本文关键字:多重继承 控制 用户 | 更新日期: 2023-09-27 18:34:48
我想创建自己的用户控件,这些控件实现的属性和方法比.NET Framework给出的属性和方法更多。首先,我想有一个自定义UserControl
类,我称之为MyUserControl
,当然会继承自UserControl
:
public class MyUserControl : UserControl {
public MyUserControl() : base() {
}
...
}
之后,我想拥有自己的MyTestBox
,它将继承TextBox
。
public class MyTextBox : TextBox {
public MyTextBox() : base() {
}
...
}
我现在的问题是我也希望MyTextBox
从MyUserControl
继承,因为我在那里实现了属性和方法,我也需要在MyTextBox
中。
我能想到的唯一解决方案是使MyTextBox仅从MyUserControl继承而不是从TextBox继承,但是在构造函数中添加一个TextBox:
public class MyTextBox : MyUserControl {
public MyTextBox() : base() {
Add(new TextBox());
}
...
}
但随后我将不得不重新实现MyTextBox
中的每个属性和TextBox
方法。有没有更好的方法来实现这一目标?
公共代码分离到一个单独的类中,并使用委托来处理它。
即像这样:
public class MyUserControl : UserControl
{
private MyExtraControlCode _Extras;
public MyUserControl()
{
_Extras = new MyExtraControlCode(this);
}
public int GetInt32Value()
{
return _Extras.GetInt32Value();
}
}
public class MyTextBox : TextBox
{
private MyExtraControlCode _Extras;
public MyTextBox()
{
_Extras = new MyExtraControlCode(this);
}
public int GetInt32Value()
{
return _Extras.GetInt32Value();
}
}
或类似的东西。
不是那么简单,但 .NET 不支持多重继承。
在更详细地研究了这个问题之后,我终于得出了这个结论: 有 3 种方法可以实现我想要的,但所有这些都需要一些额外的实现。
首先,C# .NET 不支持多重继承。就我而言,无论如何都会使事情变得更加复杂,因为MyTextBox
我希望能够从MyUserControl
和TextBox
访问自定义属性/方法。但是这两个类都继承自组件类,所以多重继承(如果可能的话(会在这里搞砸事情。我问自己的问题是:你最终想做什么?答案是,我只是希望能够"扩展"我所有的UserControls
(或Components
(一般(即关于所有UserControls
(和具体(即关于TextBox
、Combobox
、ListView
等(,这样当我创建一个 MyTextBox 对象时,我可以同时执行这两项操作:
myTextBox.MyUserControlStuff();
和
myTextBox.TextBoxStuff();
所以这是我的解决方案:
1. 使用扩展
并扩展用户控件(或组件(类。在这种情况下,我有:
public class MyTextBox : TextBox
{
public void MyTextBoxStuff()
{
...
}
}
public static class UserControlExtensions
{
public static void MyUserControlStuff(this UserControl control)
{
...
}
}
MyTextBox还可以做所有UserControl和TextBox的事情
。缺点:每个(特定(扩展方法也适用于用户控件。
2. 使用界面
public class MyTextBox : TextBox, IUserControlStuff
{
public void MyTextBoxStuff()
{
...
}
public void MyUserControlStuff()
{
...
}
}
public interface IUserControlStuff
{
public void MyUserControlStuff();
}
缺点:我将不得不一次又一次地重新实现MyUserControlStuff。
3. 使用一个"额外的代码"类,并使其成为每个自定义 UserControl 和 MyUserControl 的成员(如 @Mr.Karlsen 建议的那样(
请参阅@Mr.Karlsen的回答了解更多详情。我会说这是最好的解决方案,但它有其缺点
缺点:有点乱。刚接触我的项目的开发人员在第一次看到它时会发现很难理解。我个人会避免它。
最后,我决定使用界面,因为我的用户控件属性/方法特定于我的需求,因此使用"特定"内容扩展UserControl并不好。在我的情况下,我必须编写更多的代码,甚至在实现我的接口方法时重写相同的代码,我真的很讨厌。无论如何!!