无源代码的Java多重继承

无源代码的Java多重继承,java,interface,multiple-inheritance,extend,Java,Interface,Multiple Inheritance,Extend,我有一个叫做东西的类和一个叫做机器人的类东西有一个公共的空setBlocksExit()Robot也有一些我想要的方法 我已经扩展了机器人,但我还想从东西获得setBlocksExit()。我将创建一个具有setBlocksExit()的接口,然后创建如下类: public class C extends Robot implements BlockExit {} 问题是我无法访问Thing和Robot的源代码。我使用的是一个教育包'becker.jar',所有的代码都经过编译,所以我无法访问

我有一个叫做
东西
的类和一个叫做
机器人
的类<代码>东西有一个公共的空
setBlocksExit()
Robot
也有一些我想要的方法

我已经扩展了
机器人
,但我还想从
东西
获得
setBlocksExit()
。我将创建一个具有
setBlocksExit()
的接口,然后创建如下类:

public class C extends Robot implements BlockExit {}

问题是我无法访问
Thing
Robot
的源代码。我使用的是一个教育包'becker.jar',所有的代码都经过编译,所以我无法访问它来提取接口。我的选择是什么?

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

public class MyRobot extends Robot implements IBlockingObject

您可以在其中强制执行接口

interface IBlockingObject{
   void setBlocksExit(boolean blocksExit);
}
然后,您可以在代码的其他地方可靠地使用
IBlockingObject
,而无需太多开销

另一种选择是用
Robot
Thing
作为成员字段组成一个类

差不多

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

我认为从长远来看,第一种方法对您来说会更灵活。

一种替代方法是将
Robot
东西
包装在您自己的包装器类中

public class MyRobot extends Robot implements IBlockingObject

您可以在其中强制执行接口

interface IBlockingObject{
   void setBlocksExit(boolean blocksExit);
}
然后,您可以在代码的其他地方可靠地使用
IBlockingObject
,而无需太多开销

另一种选择是用
Robot
Thing
作为成员字段组成一个类

差不多

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
    调用的
    对象进行引用
  • 创建一个新类,引用一个
    机器人
    和一个
    对象
    并委托对这两个对象的调用
如果您使用的是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都具有类似的功能。

您的选项如下:

  • 扩展
    Thing
    并引用一个
    Robot
    ,您可以将所有
    Robot
    方法委托给它
  • 扩展
    Robot
    并对您委托
    setBlocksExit
    调用的
    对象进行引用
  • 创建一个新类,引用一个
    机器人
    和一个
    对象
    并委托对这两个对象的调用
如果您使用的是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都有类似的功能。

Robot扩展了吗?@immibis不,不幸的是,它没有。在教育软件包中不包含源代码是令人愤慨的。嗯……1)你不需要源代码来“提取”或使用接口2)有库/类/JAR浏览器3)如果你真的想使用适配器模式,Java可以反编译。为什么你需要源代码,只要扩展它,你就可以完全修改(几乎)任何东西。Robot会扩展吗?@immibis不,不幸的是不会。在教育软件包中不包含源代码是令人愤慨的。嗯……1)你不需要源代码来“提取”或使用接口2)有库/类/JAR浏览器3)如果你真的想使用适配器模式,Java可以反编译。为什么你需要源代码,只需扩展它,你就可以完全修改(几乎)这似乎是一个不错的解决方案,尽管我不太明白。你能用代码给我看一下吗?快速提问,“flag”是什么意思,还是仅仅是一个占位符名称?如果该方法需要4个参数,我会传递4个占位符名称吗?还有,你是如何在void方法中返回的?是的
flag
只是一个布尔变量的通用名称:-)您可能会想出更好的名称。这似乎是一个不错的解决方案,尽管我不太理解它。你能用代码给我看一下吗?快速提问,“flag”是什么意思,还是仅仅是一个占位符名称?如果该方法需要4个参数,我会传递4个占位符名称吗?还有,你是如何在void方法中返回的?是的
flag
只是布尔变量的通用名称:-)您可能会想出更好的名称。