使用接口C#进行多重继承

时间:2009-12-31 05:40:41

标签: c# interface multiple-inheritance

我正在尝试将两个类的选择性功能用于第三类。例如,我有Button1类创建一个花哨的按钮边框和Button2类,它以彩色格式写入文本。现在这些类是由第三方供应商提供给我的,我无法访问代码。这些类没有密封,所以我可以继承,两者都是从基类Button类派生的。

现在我的要求是创建一个名为Button3类的第三个类,它具有制作花哨边框和彩色文本的功能。理想情况下,我会继承两个类并使用特定的功能。这在C#中是不可能的,因为它没有多重继承。

我正在阅读,在这种情况下,接口有助于实现结果。我会请求某人指导我如何在一个类中使用两个类的特定功能。

5 个答案:

答案 0 :(得分:1)

正如其他人所说,如果您的应用程序确实需要从给定的两个UI类继承,那么您将无法执行此操作。

比用户界面更普遍,这里有一个想到这个:

  • 完全继承意味着“是一种”关系。带有花哨边框的按钮是按钮,但它们不能是带有花哨文字的按钮。

  • 接口定义了“has-a”关系。在这里,您可以“在按钮上设置精美边框”和“在按钮上设置精美文字的功能”。在这些方面,没有什么可以阻止你将两个“能力”应用于同一个按钮类。

因此,界面允许您进行聚合。考虑两个类DoerOfThis: IThisDoerOfThat: IThat。要创建第三个类同时执行DoThisDoThat的内容,聚合:

public class Something : IThis, IThat
{
  public This DoerOfThis { set; }
  public That DoerOfThat { set; }

  public void DoThis()
  {
     DoerOfThis.DoThis();
  }

  public void DoThat()
  {
     DoerOfThat.DoThat();
  }
}

答案 1 :(得分:1)

尝试使用抽象工厂模式。

答案 2 :(得分:0)

即使C#具有多重继承,您也不能只采用不同类的随机部分并将它们组合在一起。问题是你需要的方法只有当它们存在于类中时才能工作,并与该类中的其他方法和私有状态一起工作。如果您尝试将一个类中的方法与另一个类混合和匹配,则它们将无法共享其内部状态。因此,您可能尝试的下一件事是使用包含并拥有内部状态的两个副本,但这会导致尝试保持同步的问题。此外,现在两个班级都希望能够访问绘画方法,等等。他们很可能互相争斗并且互相交换变化,而不是一起工作。很难做到这一点。

您需要做的是获取两个Button类之一的源代码,并使用其他Button类的源代码作为灵感来修改它(您不太可能直接使用代码)。如果您无法访问(或合法使用权利)源代码,那么我担心您不能这样做。

您剩下的选项是:

  • 联系Button1的作者,要求他们从Button2添加所需的功能。
  • 请联系Button2的作者,要求他们从Button1添加所需的功能。
  • 自己写一个新的按钮类。

答案 3 :(得分:0)

接口只定义方法签名,但不定义方法主体。这意味着即使您使用接口,仍然无法在Button1Button2中获取行为。

您可以要求您的供应商执行以下操作:

  1. 创建接口,定义花式按钮边框和彩色文本的必要属性
  2. 创建绘制幻想按钮边框的方法,并通过接受上面定义的界面以彩色格式书写文本。
  3. 然后从两个接口继承你的button3,调用上面的方法来做任何需要做的事情。

答案 4 :(得分:0)

在我看来,当你想要模拟多重继承时,组合与继承一起工作。但是在使用控件时,这通常不是一个选项,因为您通常是另一个控件中的控件。 您可以查看的一些选项是

用户控件 - 如果您使用的是winforms 嵌套控件 - 如果您使用的是WPF。