繁体   English   中英

没有源代码的Java多重继承

[英]Java Multiple Inheritance without Source Code

我有一个名为Thing的课程和一个名为Robot的课程。 Thing具有公共无效setBlocksExit() Robot有一些我也想要的方法。

我已经扩展了Robot但是我还想要Thing setBlocksExit() 我将创建一个具有setBlocksExit()的接口,然后创建一个类似以下的类:

public class C extends Robot implements BlockExit {}

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

一种选择是将RobotThing包装在您自己的包装器类中

public class MyRobot extends Robot implements IBlockingObject

public class MyThing extends Thing implements IBlockingObject

您可以在其中强制界面

interface IBlockingObject{
   void setBlocksExit(boolean blocksExit);
}

然后,您可以在代码中的其他IBlockingObject可靠地使用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);
  }
}

我认为从长远来看,第一个对您来说将更加灵活。

您的选择如下:

  • 扩展Thing并引用一个将所有Robot方法委托给它的Robot的引用。
  • 扩展Robot并引用您将setBlocksExit调用委托给Thing对象的对象。
  • 创建一个新的类,并引用一个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都具有类似的功能。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM