Java 无源代码的多重继承

Java Multiple Inheritance without Source Code

我有一个叫 Thing 的 class 和一个叫 Robot 的 class。 Thing 有一个 public void setBlocksExit()Robot 有一些我也想要的方法。

我已经扩展了 Robot,但我还想从 Thing 扩展 setBlocksExit()。我会制作一个具有 setBlocksExit() 的界面,然后制作一个 class,例如:

public class C extends Robot implements BlockExit {}

问题是我无法访问 ThingRobot 的源代码。我正在使用教育包 'becker.jar' 并且所有代码都已编译,因此我无法访问它来提取接口。我有哪些选择?

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

public class MyRobot extends Robot implements IBlockingObject

public class MyThing extends Thing implements IBlockingObject

在哪里你可以强制界面

interface IBlockingObject{
   void setBlocksExit(boolean blocksExit);
}

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

另一种选择是使用 RobotThing 作为成员字段

组成一个 class

类似于

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);
  }
}

我想第一个对你来说更灵活 运行。

您的选择如下:

  • 扩展 Thing 并引用一个 Robot,您将所有 Robot 方法委托给它。
  • 扩展 Robot 并引用您委托 setBlocksExit 调用的 Thing 对象。
  • 创建一个新的 class 并引用 Robot 和引用 Thing 并委托对这两个对象的调用。

如果您使用的是 IDE,例如 Eclipse,您甚至可以 "extract interfaces" 并自动生成委托方法。

选项 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,则可以使用此功能:

  • Fast implement wrapping (delegate methods) in Eclipse?

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