无源代码的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
对象进行引用
- 创建一个新类,引用一个
和一个机器人
并委托对这两个对象的调用对象
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
对象进行引用
- 创建一个新类,引用一个
和一个机器人
并委托对这两个对象的调用对象
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
只是布尔变量的通用名称:-)您可能会想出更好的名称。