在Java中设计没有多重继承的类层次结构

时间:2010-11-19 09:11:54

标签: java subclassing

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

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

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

用户需要进度监视器,因此我创建了一个从Carrier扩展的抽象类MonitoredCarrier(MC)。具体类从受监控的载体扩展。

在用户需求发生变化之前,它可以正常运行一段时间。现在我需要一个MonitoredTimedCarrier。我显然不能将TC和MC都分类。我正在考虑将MC作为一个接口来实现:

class TimedCarrier implements IMonitored
class Carrier implements IMonitored

(因为这对我来说在这个领域的背景下更有意义,我应该能够监控运营商是否有时间),但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() {...}
}

3 个答案:

答案 0 :(得分:3)

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

同上MonitoredCarrier

当然,如果不知道发生了什么的细节,很难确切地说这是否合适,但这是我多次成功使用的方法。 (顺便说一下,你需要Carrier成为一个抽象类而不是一个接口吗?有一个接口然后是一个实现常用操作接口的抽象类可能有意义吗?)

答案 1 :(得分: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和类似内容。

答案 2 :(得分:0)

我将Carrier,Timer和Monitor作为接口,因此类可以实现他们需要的任何东西。

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

这只是一种潜在的方式,有多种设计模式可以帮到你。祝你好运!