我有一个名为Thing
的班级和一个名为Robot
的班级。 Thing
有公开无效setBlocksExit()
。 Robot
有一些我也想要的方法。
我已延长Robot
,但我也希望来自setBlocksExit()
的{{1}}。我会创建一个具有Thing
的接口,然后创建一个类:
setBlocksExit()
问题是我无法访问public class C extends Robot implements BlockExit {}
和Thing
的源代码。我正在使用教育软件包' becker.jar' 并且所有代码都已编译,因此我无法访问它以提取接口。我有什么选择?
答案 0 :(得分:3)
一种替代方法是将Robot
和Thing
包装在您自己的包装类中
public class MyRobot extends Robot implements IBlockingObject
和
public class MyThing extends Thing 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);
}
}
我认为从长远来看,第一个对你来说会更灵活。
答案 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具有类似功能。