【问题标题】:How to Simulate Multiple Inheritance如何模拟多重继承
【发布时间】:2014-11-25 11:50:35
【问题描述】:

我想练习在 C# 中使用接口来模拟多重继承。然而,我并不完全明白。谁能给我解释一下我的想法哪里错了?

我有两类逆变器和序列。 Inverter 有一个 .doAction() ,它只是交换字符串中的字符位置。序列实际上是一个父级和两个子级的类层次结构。他们只是通过 .doAction() 方法以各种方式操作字符串。通过重写 .doAction() 方法来区分顺序的对象。

现在,我想创建一个名为 invSeq 的新类,它具有逆变器和序列的功能。

我做的是这样的:

public class inVSeq : inverter, seq1, seq2, seq3

接口属于序列层次结构下每个类的三个不同的 .doAction()。

所以据我了解,我必须再次创建这些 seq1、seq2、seq3 (.doAction()) 方法。但是如何重用现有序列层次结构中的 .doAction() 方法?如果我只是重写接口的代码,我觉得类之间没有真正的联系。

我可以使用组合(在 inVSeq 中保存私有序列对象 (3)),但这会破坏接口的使用。

【问题讨论】:

  • 多重继承不好,gen-spec 关系太僵化,以后当你想改变继承层次时可能会导致严重的问题,优先考虑组合而不是 gen-spec 关系。如果invertersequence 都有Foo() 怎么办?
  • 添加一个 gen-spec 关系只是为了代码重用是一种反模式,可能迟早会导致钻石问题
  • 应使用此代码调用哪个 doActioninVSeq.doAction()?

标签: c# interface multiple-inheritance


【解决方案1】:

你刚才描述的叫做Composite pattern,接口的组合是这个模式的组成部分。

doAction() 的接口将是基本组件,该接口的各种实现将是叶子,复合将组成这些实现。这样,调用doAction()的客户端就不需要知道它调用的是什么具体的实现,使得代码更加模块化。

【讨论】:

  • 这帮助我思考得更清楚了。确实需要组合来实现代码重用能力。谢谢!
【解决方案2】:

可以使用组合(在 inVSeq 中保存私有序列对象 (3)),但这会破坏接口的使用。

这不会破坏接口的使用,您可以将接口传递给构造函数。

从多个接口派生一个类意味着该类需要实现(即重写)所有这些接口方法的代码(或调用基类实现)。优先组合而不是继承。

【讨论】:

  • 这应该是评论,而不是答案。
猜你喜欢
  • 1970-01-01
  • 2011-03-13
  • 2020-06-08
  • 2017-03-31
  • 2010-12-11
  • 2023-03-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多