我正在试图弄清楚如何为我正在实施的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() {...}
}
答案 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中无处不在。查看Runnable
,Comparable
和类似内容。
答案 2 :(得分:0)
我将Carrier,Timer和Monitor作为接口,因此类可以实现他们需要的任何东西。
至于功能的混合,你可以让MonitoredTimedCarrier扩展MonitoredCarrier并实现Timer,然后将所有Timer方法代理到一个内部类,它使用你需要的功能扩展你的抽象类。
这只是一种潜在的方式,有多种设计模式可以帮到你。祝你好运!