Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/317.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_Inheritance_Abstract Class_Multiple Inheritance - Fatal编程技术网

Java—扩展整个类层次结构

Java—扩展整个类层次结构,java,inheritance,abstract-class,multiple-inheritance,Java,Inheritance,Abstract Class,Multiple Inheritance,我有这样的类层次结构: abstract class BaseThing { public abstract void doSomething(); } class Thing1 extends BaseThing { @Override public void doSomething() { doSomethingWithThing1(); } } class Thing2 extends BaseThing { @Overr

我有这样的类层次结构:

abstract class BaseThing
{
    public abstract void doSomething();
}

class Thing1 extends BaseThing
{
    @Override
    public void doSomething()
    {
        doSomethingWithThing1();
    }
}

class Thing2 extends BaseThing
{
    @Override
    public void doSomething()
    {
        doSomethingWithThing2();
    }
}

// A dozen more classes that extend the BaseThing class. 
我需要创建整个树的扩展版本。Java中没有多重继承,因此我将其创建为:

interface BaseThingExt
{
   public void doSomethingElse();
}

class Thing1Ext extends Thing1 implements BaseThingExt
{
    @Override
    public void doSomethingElse()
    {
        doSomethingElseWithThing1();
    }
}

//   All Thing.. classes are extended by ThingExt... classes
现在是问题我可以将所有ThingText类的一些公共字段放在哪里?我不能将它们放在基本接口中,因为它们将成为
最终静态
。我不能使BaseThingText成为抽象类,因为Java不支持多重继承。我不敢相信唯一的解决办法就是在所有ThingText类中复制它们十几次


编辑:请注意,所有ThingText类都应该扩展其相应的类,而不仅仅是BaseThing类,因为每个派生类都有一些细节。所以我的答案是行不通的

通常的技巧是使用组合而不是继承:

interface BaseThingExt
{
   public void doSomethingElse();
}

class ConcreteImplementation implements BaseThing, BaseThingExt {

    private final BaseThing thingDelegate;
    private final BaseThingExt extDelegate;

    public ConcreteImplementation(BaseThing thing, BaseThingExt ext) {
        this.thingDelegate = thing;
        this.extDelegate = ext;
    }


    @Override
    public void doSomething() {
        thingDelegate.doSomething();
    }

    @Override
    public void doSomethingElse() {
        extDelegate.doSomethingElse();
    }
}

我建议添加一个超级类AbstractBaseThingText:

abstract class AbstractBaseThingExt implements BaseThingExt
{
    private Object commonField;
    public Object getCommonField(){}
    public Object setCommonField(Object commonField){}
}

class ThingExt extends AbstractBaseThingExt
{
    public ThingExt(BaseThing base) {
        this.base = base;
    }

    public void doSomething()
    {
        this.base.doSomething();
    }
}

ThingText类应该在适当的时候将实现委托给
base

为什么不在
BaseThing
中实现
basethingText
,并不断扩展
Thing1
Think2
。@Shree Krishna:BaseThing和basethingText生活在不同的包中。有些情况下,客户端只能使用BaseThing。你不能创建一个抽象类来实现接口,包括你的字段,并使用抽象getter/setter方法来实现和扩展具体类吗?你的设计迫使复制了十几次。你在浪费一个接口可以覆盖的扩展。@马克·基恩:我可以,但由于BaseThingText已经扩展了BaseThing,所以它不能扩展这个抽象类。不起作用。Thing1Ext应该扩展Thing1而不是基本内容,这里有一些常见的细节。明白了。在这种情况下,唯一的解决方案是使用组合:
class ThingExt扩展AbstractBaseThingText
,AbstractBaseThingText是包含公共字段的抽象类。然后
ThingExt
应该在构造函数中采用
BaseThing
。编辑我的答案…@Flot2011,您自己提出的解决方案正是如此
ThingXExt扩展ThingX
,ThingX
扩展BaseThing
。你不能在层次结构中进一步删除
BaseThing
的继承。@ChiefTwoPencils:是的,但我可以在Thing1Text中使用特定于Thing1的代码,而不必到处打字。我终于明白了这个解决方案困扰我的原因。对于每个具体的实现对象,我必须有两个实例,一个是Thing类,一个是ThingExt类,而不是现在只有一个。我是对的还是我遗漏了什么?是的。其思想是,您拥有Thing的类层次结构和ThingText的类层次结构,该类允许使用这两个层次结构的任何成员创建这两个层次结构的实例。