【问题标题】:Converting my C++ code to Java: Translating multiple inheritance [closed]将我的 C++ 代码转换为 Java:翻译多重继承 [关闭]
【发布时间】:2014-05-09 22:55:52
【问题描述】:

使用 Java 的第一天。非常基本的问题:我有三个基类,由许多类多重继承。这些基类中的每一个都有很多实现,而抽象方法很少:

class Consumer { /* lots of stuff */ };
class Producer { /* lots of stuff */ };
class Logger { /* lots of stuff */ };

class A : public Consumer, Producer, Logger {}
...
class Z : public Consumer, Producer, Logger {}

现在我知道我可以将三个基类中的两个转换为接口,并多重继承这两个接口并扩展一个类。不够充分,因为这些基类中的所有实现复制到许多子类中没有意义。

我正在阅读一些关于委托或组合的东西,但我不知道如何在这里应用它。基本上,我的思维过程是由我的 C++ 经验所塑造的。 将我的 C++ 类结构转换为 Java 的阻力最小的路径是什么?

如果需要,我可以填写更多的基类,但希望没有必要。

【问题讨论】:

  • Consumer、Producer 和 Logger 是实际的类,还是针对这个问题重命名的?
  • 我的猜测是它被重命名为这个问题...... ;-)
  • @zmo 我不需要知道他们的名字,我需要知道他们在什么级别上运作。我的意思是,什么的消费者?
  • 无论如何,我投票赞成关闭这个问题,因为它太宽泛了,因为它没有明显的简单解决方案。
  • @zmo 好吧,这不是必需的,但我有点担心这个设计无法自己挽救。 Consumer 和 Producer 过于通用,Logger 应该使用组合创建。

标签: java c++ oop inheritance


【解决方案1】:

将我的 C++ 类结构转换为 Java 的阻力最小的路径是什么?

拿起笔和纸,重新思考你的问题,然后做出更接近 Java 工作原理的设计。

没有任何神奇的规则可以将多重继承的任何给定问题转变为没有多重继承的另一个问题。鉴于这种情况,您可能希望通过创建多个相互引用的类来分离关注点,而您在 C++ 中只有一个……但这取决于您正在处理的具体问题,您将如何构建您的层次结构类和接口以及生成的不同类实例如何相互关联。

【讨论】:

    【解决方案2】:

    你有两个选择:

    为 Consumer、Producer 和 Logger 创建 3 个接口,并让 A 和 Z 类实现它们。当然,对于每个类,您都必须提供一个实现。如果实现相同,则创建一个更通用的类(它可以是抽象的,您可能不需要实例化它)实现 3 个接口,然后使类 A 和 Z 扩展抽象类。

    正如您在帖子中所说,似乎此解决方案不符合您的需求,因此请改用委托,在 A 和 Z 类中放置消费者、生产者和记录器类型的 3 个新字段(作为实例变量)(您可以在构造函数中实例化它们),然后放置作为消费者、生产者和记录器方法的包装器的方法。

    【讨论】:

    • 这实际上是非常实用的建议。我认为你的两个建议都是可行的。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-10
    • 2012-02-06
    • 1970-01-01
    • 2010-10-28
    • 2014-09-12
    相关资源
    最近更新 更多