3

我想创建自己的用户控件,它实现的属性和方法比 .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());
   }
   ...
}

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

4

2 回答 2

3

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

IE。像这样的东西:

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 中不支持多重继承。

于 2013-10-10T11:26:55.167 回答
0

在更详细地查看问题后,我终于得出了这个结论:有3种方法可以实现我想要的,但它们都需要一些额外的实现。

首先,C# .NET 不支持多重继承。在我的情况下,无论如何它都会使事情变得更加复杂,因为MyTextBox我希望以一种方式能够从MyUserControl和访问自定义属性/方法TextBox。但是这两个类都继承自组件类,所以多重继承(如果可能的话)会在这里搞砸。我问自己的问题是:你最终想做什么?答案是,我只是希望能够“扩展”我的所有UserControls(或Components)一般(即关于 all UserControls)和具体(即关于TextBoxComboboxListView等),这样当我创建一个 MyTextBox 对象时,我可以两者都做:

myTextBox.MyUserControlStuff();

myTextBox.TextBoxStuff();

所以这是我的解决方案:

1.使用扩展

并扩展 UserControl(或 Component)类。在这种情况下,我有:

public class MyTextBox : TextBox
{
    public void MyTextBoxStuff()
    {
        ...
    }
}

public static class UserControlExtensions
{
    public static void MyUserControlStuff(this UserControl control)
    {
        ...
    }
}

MyTextBox 也可以做所有 UserControl 的东西和 TextBox 的东西

缺点:每个(特定)扩展方法也适用于 UserControl。

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 属性/方法是特定于我的需要的,所以用“特定”的东西来扩展 UserControl 并不好。在我的情况下,我必须编写更多代码,甚至在实现我的接口方法时重新编写相同的代码,我真的很讨厌。反正!!

于 2013-10-11T09:53:11.100 回答