Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/340.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java中无多重继承类层次结构的设计_Java_Subclassing - Fatal编程技术网

Java中无多重继承类层次结构的设计

Java中无多重继承类层次结构的设计,java,subclassing,Java,Subclassing,我试图找出如何为我正在实现的Carrier类设计类层次结构 我目前有一个抽象基类载体 我有另一个抽象类TimedCarrier(TC),它用时间和域相关信息扩展了Carrier。具体类别从Carrier和TimedCarrier扩展而来 用户需要一个进度监视器,所以我创建了一个抽象类MonitoredCarrier(MC),它从Carrier扩展而来。混凝土等级从监控载体延伸而来 在用户需求改变之前,这种方法可以正常工作一段时间。现在我需要一个监控的实时载体。我显然不能同时将TC和MC分为子类。

我试图找出如何为我正在实现的Carrier类设计类层次结构

我目前有一个抽象基类载体

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

用户需要一个进度监视器,所以我创建了一个抽象类MonitoredCarrier(MC),它从Carrier扩展而来。混凝土等级从监控载体延伸而来

在用户需求改变之前,这种方法可以正常工作一段时间。现在我需要一个监控的实时载体。我显然不能同时将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() {...}
}

我觉得你应该考虑授权。例如,它不是扩展
TimedCarrier
的类,而是扩展
Carrier
,然后作为委托实例传递给
TimedCarrier
的构造函数
TimedCarrier
随后会委派操作,但也会跟踪时间

同上
MonitoredCarrier


当然,在不知道发生了什么的细节的情况下,很难说这是否合适,但这是我已经成功使用过好几次的方法。(顺便问一下,你是否需要
Carrier
成为一个抽象类而不是一个接口?拥有一个接口,然后再拥有一个抽象类来实现用于常见操作的接口是否有意义?

我觉得你应该考虑使用委托。例如,它不是扩展
TimedCarrier
的类,而是扩展
Carrier
,然后作为委托实例传递给
TimedCarrier
的构造函数
TimedCarrier
随后会委派操作,但也会跟踪时间

同上
MonitoredCarrier


当然,在不知道发生了什么的细节的情况下,很难说这是否合适,但这是我已经成功使用过好几次的方法。(顺便问一下,你是否需要
Carrier
成为一个抽象类而不是一个接口?拥有一个接口,然后再拥有一个抽象类来实现通用操作的接口,这可能有意义吗?

我会这样处理它

interface Timeable {....}
interface Monitorable {....}
interface Carrier {....}
然后继续这个

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

这不是一个牵强的想法。它在JavaAPI中无处不在。看看
Runnable
Comparable
和类似的东西。

我会这样处理它

interface Timeable {....}
interface Monitorable {....}
interface Carrier {....}
然后继续这个

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

这不是一个牵强的想法。它在JavaAPI中无处不在。看看
Runnable
Comparable
和类似的功能。

我会将载波、定时器和监视器作为接口,这样类就可以实现它们需要的任何功能

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


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

我会将载波、定时器和监视器作为接口,这样类就可以实现它们需要的任何东西

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


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

我不得不同意。在很多情况下,构图胜过继承。我不得不同意。在许多情况下,组合胜过继承。