没有源代码的Java多重继承

时间:2015-03-16 21:28:30

标签: java interface multiple-inheritance extend

我有一个名为Thing的班级和一个名为Robot的班级。 Thing有公开无效setBlocksExit()Robot有一些我也想要的方法。

我已延长Robot,但我也希望来自setBlocksExit()的{​​{1}}。我会创建一个具有Thing的接口,然后创建一个类:

setBlocksExit()

问题是我无法访问public class C extends Robot implements BlockExit {} Thing的源代码。我正在使用教育软件包' becker.jar' 并且所有代码都已编译,因此我无法访问它以提取接口。我有什么选择?

2 个答案:

答案 0 :(得分:3)

一种替代方法是将RobotThing包装在您自己的包装类中

public class MyRobot extends Robot implements IBlockingObject

public class MyThing extends Thing implements IBlockingObject

您可以强制界面

interface IBlockingObject{
   void setBlocksExit(boolean blocksExit);
}

然后,您可以在代码中的其他位置可靠地使用IBlockingObject,而不会产生太多开销。

另一种选择是将RobotThing作为成员字段组成一个类

这样的东西
public class RobotThing extends IBlockingObject{
  // This is now a robot thing...
  private Robot mRobot;
  private Thing mThing;

  @Override 
  public void setBlocksExit(boolean blocksExit){ 
    mRobot.setBlocksExit(blocksExit);
    mThing.setBlocksExit(blocksExit);
  }
}

我认为从长远来看,第一个对你来说会更灵活。

答案 1 :(得分:1)

您的选择如下:

  • 扩展Thing并引用您委派所有Robot方法的Robot
  • 扩展Robot并引用您委派Thing来电的setBlocksExit个对象。
  • 创建一个新类,并引用Robot和对Thing的引用,并委托对这两个对象的调用。

如果你正在使用像Eclipse这样的IDE,你甚至可以提取界面"并自动生成委托方法。

选项1:

class C extends Thing {
    final Robot robot;
    public C(Robot robot) {
        this.robot = robot;
    }

    public int robotMethod1() {
        return robot.robotMethod1();
    }

    ...
}

选项2:

class C extends Robot {
    final Thing thing;
    public C(Thing thing) {
        this.thing = thing;
    }

    public void setBlocksExit(boolean flag) {
        return thing.setBlocksExit(flag);
    }

    ...
}

选项3:

class C {
    final Thing thing;
    final Robot robot;
    public C(Thing thing, Robot robot) {
        this.thing = thing;
        this.robot = robot;
    }

    public void setBlocksExit(boolean flag) {
        return thing.setBlocksExit(flag);
    }

    public int robotMethod1() {
        return robot.robotMethod1();
    }
    ...
}

如果您正在使用Eclipse,则可以使用此功能:

我确定您使用的IDE具有类似功能。