【问题标题】:Designing class hierarchy without multiple inheritance in Java [closed]在Java中设计没有多重继承的类层次结构[关闭]
【发布时间】:2010-11-19 09:11:54
【问题描述】:

我正在尝试弄清楚如何为我正在实现的 Carrier 类设计类层次结构。

我目前有一个抽象基类 Carrier。

我有另一个抽象类 TimedCarrier(TC),它使用时间和域相关信息扩展 Carrier。具体类扩展自 Carrier 和 TimedCarrier。

用户需要一个进度监视器,所以我创建了一个从 Carrier 扩展的抽象类 MonitoredCarrier(MC)。具体类从 Monitored Carrier 扩展而来。

在用户需求发生变化之前,这可以正常工作一段时间。现在我需要一个 MonitoredTimedCarrier。我显然不能同时继承 TC 和 MC。我正在考虑将 MC 实现为接口:

class TimedCarrier implements IMonitored
class Carrier implements IMonitored

(因为在这个领域的上下文中这对我来说更有意义,我应该能够监控 Carriers 是否定时),但是 MC 是丰富实现的类,我将不得不复制粘贴所有将方法转换为过去从 MC 扩展而来的类。我不想重复代码。

然后我将如何解决这个问题?谢谢。

[编辑]

TimedCarrier 使用一组成员变量和 getter/setter 方法扩展了 Carrier。 MonitoredCarrier 使用成员变量、getter/setter 方法和一系列与监视器一起使用的方法扩展 Carrier。

class TimedCarrier extends Carrier {
    int var1..
    int var2..

    public void setVar1(int var1) {...}
    public int getVar1() {...}
    ....
}

class MonitoredCarrier extends Carrier {
    int var1..
    int var2..

    public void setVar1(int var1) {...}
    public int getVar1() {...}
    ....
    public void monitorSomething() {...}
    public void monitorOtherSomething() {...}
}

【问题讨论】:

    标签: java subclassing


    【解决方案1】:

    在我看来,您应该考虑使用委托。例如,代替类扩展 TimedCarrier,它只会扩展Carrier - 然后作为委托实例传递给TimedCarrier 的构造函数。 TimedCarrier 然后会委派操作,但也会跟踪时间。

    同上MonitoredCarrier

    当然,在不知道具体情况的情况下,很难确切地说这是否合适,但这是我成功使用过多次的方法。 (顺便说一句,你需要Carrier 是一个抽象类而不是一个接口吗?有一个接口,然后一个抽象类实现通用操作的接口可能有意义吗?)

    【讨论】:

    • 我必须同意。在许多情况下,组合胜过继承。
    【解决方案2】:

    我会这样处理它,

    interface Timeable {....}
    interface Monitorable {....}
    interface Carrier {....}
    

    然后继续这个。

    class TimedCarrier implements Carrier, Timeable {....}
    class MonitoredCarrier implements Carrier, Monitorable {....}
    class MonitoredTimedCarrier implements Carrier, Timeable, Monitorable {....}
    

    这不是一个牵强的想法。它在 Java API 中无处不在。看看RunnableComparable 和类似的。

    【讨论】:

      【解决方案3】:

      我会将 Carrier、Timer 和 Monitor 作为接口,这样类就可以实现它们需要的任何东西。

      至于功能的混合,您可以让 MonitoredTimedCarrier 扩展 MonitoredCarrier 并实现 Timer,然后将所有 Timer 方法代理到一个内部类,该类扩展您的抽象类并具有您需要的功能。

      这只是一种可能的方式,这里有多种设计模式可以为您提供帮助。祝你好运!

      【讨论】:

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