0

我正在尝试将两个类的选择性特征用于第三类。例如,我有创建精美按钮边框的 Button1 类和以彩色格式编写文本的 Button2 类。现在这些类是由我无法访问代码的 3rd 方供应商提供给我的。这些类不是密封的,所以我可以继承,并且两者都是从基 Button 类派生的。

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

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

4

5 回答 5

1

正如其他人所说,如果您的应用程序确实需要继承给定的两个 UI 类,那么您将无法做到这一点。

比使用 UI 更普遍的是,这里有一个需要考虑的问题:

  • 完全继承意味着一种“is-a”关系。带有精美边框的按钮是按钮,但它们不能是带有精美文本的按钮。

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

所以一个接口可以让你进行聚合。考虑两个类DoerOfThis: IThisDoerOfThat: IThat。要创建第三类Something,它同时执行DoThisand DoThat,聚合:

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

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

  public void DoThat()
  {
     DoerOfThat.DoThat();
  }
}
于 2009-12-31T06:08:30.590 回答
1

尝试使用抽象工厂模式。

于 2009-12-31T10:15:47.530 回答
0

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

您需要做的是获取两个 Button 类之一的源代码,并以另一个 Button 类的源代码为灵感对其进行修改(您不太可能直接使用该代码)。如果您无权访问(或使用合法权利)源代码,那么恐怕您不能这样做。

您剩下的选择是:

  • 联系 Button1 的作者,请求他们从 Button2 添加所需的功能。
  • 联系 Button2 的作者,请求他们从 Button1 添加所需的功能。
  • 自己编写一个新的按钮类。
于 2009-12-31T05:52:02.197 回答
0

接口只定义了方法签名,而不是方法体。这意味着即使您使用界面Button1,您仍然无法获得该行为。Button2

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

  1. 创建接口,为花哨的按钮边框和彩色文本定义必要的属性
  2. 通过采用上面定义的接口,创建绘制奇特按钮边框并以彩色格式编写文本的方法。

然后你button3从两个接口继承你的,调用上面的方法来做任何需要做的事情。

于 2009-12-31T05:54:27.540 回答
0

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

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

于 2009-12-31T05:58:07.367 回答