【问题标题】:Combine the functions of two different base classes结合两个不同基类的功能
【发布时间】:2011-01-16 17:02:03
【问题描述】:

我试图将两个不同基类的功能组合成一个新类,但无济于事。假设我有 A 类和 B 类,而 B 是具有不同功能的 A 的后代(即在运行时不能用作 A 的替代品)并且需要一个结合了 A 和 B 的类 C,同时使用两者并提供C 用户的独特界面。我怎样才能实现这一点? C# 无法实现多重继承,接口似乎不适合。那我该怎么办?

【问题讨论】:

  • 啊,组合也是不可能的。它必须是继承。
  • “B 是具有不同功能的 A 的后代(即在运行时不能用作 A 的替代品)”——这听起来确实很混乱。你为什么要这样做?
  • 你能举例说明这些类会做什么吗?为什么接口和组合不起作用?
  • 一个具体的例子可能会有所帮助。如果 B 派生自 A,则 B 的实例总是可以在运行时用作 A 的实例。您可以将 B 的实例向下转换为 A 的实例。另外,您能否进一步解释一下 C。您说 C 同时使用 A 和 B,并提供独特的接口。那为什么还要考虑多重继承呢?您的描述中没有任何内容提供从任何东西派生 C 的理由。
  • 多重继承在 c# 中是可能的,但只能来自接口类型(是的,接口是 C# 中的类型:)),所以如果多重继承适合,那么接口应该是一个且相同的,这只是一个问题你把实现放在哪里

标签: c# class base


【解决方案1】:

你的设计坏了。

B 是具有不同功能的 A 的后代(即在运行时不能用作 A 的替代品)

这种情况是对继承的误用。如果你想这样做,你应该使用组合或 A 和 B 分别实现的通用接口。

【讨论】:

  • 嗯。谢谢你的花。 A 和 B 是来自外部类型库的类,即 SecureBlackbox,尤其是 TElSecureServer 和 TElDTLSServer 类。后者继承自第一个。前者可用于保护 TCP 连接,后者用于 UDP。我必须在我的应用程序中同时支持这两者,如果我可以推出自己的类(TElDTLSServer 的后代),我会做得很好。不幸的是,如果我只从 TElDTLSServer 继承,我就不能再使用我的类来保护 TCP。它根本不起作用并最终导致显式错误(出于某些原因,我不知道)。
  • 组合不起作用,因为我需要将外部对象与使用的基类相关联。基类能够在某些回调中反映对自身的引用(需要它)。如果我使用组合,则引用指向纯基类对象并且我失去了上下文。所以我必须从基类继承一个新类,添加我的对象,以检索上下文......哦,真是一团糟......
  • @neil 在这种情况下,坏的不是你的设计,而是别人的。但这并没有改变它仍然是一个破碎的设计。适应修复它的一种方法是使用您需要的功能构建您自己的接口,然后使用组合构建包装现有 A 和 B 的类型,并实现这个新接口。
  • 我这里上传了一些解释maps.alphadex.de/eldos/explained.txt
【解决方案2】:

您说BA 的后代,但是不同,不能用作A;这完全违背了继承的目的。你想达到什么目的?无论如何,听起来您应该使用组合,而不是继承。如果C 没有暴露AB 定义的接口,那么它不应该从任何一个继承。

【讨论】:

  • 不是我,提供 A 和 B。外部类型库。我希望,我可以使用 B 并将其返回到具有设置的 A 函数,但事实并非如此。 B 不适用于 TCP 连接(见上文)。
【解决方案3】:

考虑显式接口实现:

http://msdn.microsoft.com/en-us/library/ms173157.aspx

public interface IFriendly
{
  void Greet();
}

public interface IEnemy
{
  void Greet();
}

public class SomeGuy : IFriendly, IEnemy
{
  //default Greeting
  public void Greet()
  {
    //...
  }

  //greeting when using an IFriendly reference
  void IFriendly.Greet()
  {
    //,,
  }

  //greeting when using an IEnemy reference
  void IEnemy.Greet()
  {
    //,,
  }
}

【讨论】:

  • +0.5 ...当您从显式接口方法实现签名中删除 public 关键字时,您将获得另一个 0.5:->
【解决方案4】:

你需要考虑这样一个动作的事实让我认为你可能需要考虑重构你的类结构。

但是,为了解决您的直接问题,为什么不实例化两个类(忽略它们处于继承关系的事实)并按您需要的顺序调用方法?将 C 视为 A 和 B 的外观模式。

【讨论】:

  • 两个类会有所帮助,但由于接口几乎相同,我不得不分支太多(换句话说:我必须关心我所面对的底层对象的类型,而我根本不想在乎)
  • 对于那些需要具体信息的人:我在这里提供了一些详细信息:maps.alphadex.de/eldos/explained.txt 欢迎指点。
【解决方案5】:

问题解决了。现在使用 System.Reflection。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多