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() {
   }
   ...
}

我现在的问题是我也希望MyTextBoxMyUserControl继承,因为我在那里实现了属性和方法,我也需要在MyTextBox中。

我能想到的唯一解决方案是使MyTextBox仅从MyUserControl继承而不是从TextBox继承,但是在构造函数中添加一个TextBox:

public class MyTextBox : MyUserControl {
   public MyTextBox() : base() {
      Add(new TextBox());
   }
   ...
}

但随后我将不得不重新实现MyTextBox中的每个属性和TextBox方法。有没有更好的方法来实现这一目标?

C# 用户控制多重继承

将所有

公共代码分离到一个单独的类中,并使用委托来处理它。

即像这样:

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我希望能够从MyUserControlTextBox访问自定义属性/方法。但是这两个类都继承自组件类,所以多重继承(如果可能的话(会在这里搞砸事情。我问自己的问题是:你最终想做什么?答案是,我只是希望能够"扩展"我所有的UserControls(或Components(一般(即关于所有UserControls(和具体(即关于TextBoxComboboxListView等(,这样当我创建一个 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并不好。在我的情况下,我必须编写更多的代码,甚至在实现我的接口方法时重写相同的代码,我真的很讨厌。无论如何!!