0

我试图弄清楚如何为我正在实现的 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() {...}
}
4

3 回答 3

3

在我看来,您应该考虑使用委托。例如,它不会扩展类,而是扩展- 但随后作为委托实例传递给构造函数。然后将委派操作,但也要跟踪时间。TimedCarrierCarrierTimedCarrierTimedCarrier

同上MonitoredCarrier

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

于 2010-11-19T09:17:23.990 回答
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和类似的。

于 2010-11-19T09:19:45.830 回答
0

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

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

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

于 2010-11-19T09:23:52.777 回答