【问题标题】:Multiple inheritance using interface C#使用接口 C# 的多重继承
【发布时间】:2009-12-31 05:40:40
【问题描述】:

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

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

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

【问题讨论】:

  • 接口不包含实现。对于您的情况,您将无法使用供应商提供的类。你知道吗?
  • 多重继承!= 实现多个接口。接口不是这个问题的解决方案,它们是一种替代方案,就像包含一样。
  • 我提到了多重继承和接口,因为我读到接口有助于创建多重交互(主要是 Web),所以我想知道我上面提到的问题是否可以使用接口来解决?

标签: c# interface multiple-inheritance


【解决方案1】:

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

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

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

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

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

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

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

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

【讨论】:

    【解决方案2】:

    尝试使用抽象工厂模式。

    【讨论】:

      【解决方案3】:

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

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

      您剩下的选择是:

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

      【讨论】:

        【解决方案4】:

        接口只定义方法签名,而不是方法体。这意味着即使您使用接口,您仍然无法获得Button1Button2 中的行为。

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

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

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

        【讨论】:

          【解决方案5】:

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

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

          【讨论】:

            猜你喜欢
            • 2022-08-12
            • 2013-02-07
            • 2021-06-23
            • 1970-01-01
            • 2013-03-31
            • 2012-05-13
            • 2011-03-02
            • 2017-03-24
            相关资源
            最近更新 更多