[英]Java Multiple Inheritance without Source Code
我有一个名为Thing
的课程和一个名为Robot
的课程。 Thing
具有公共无效setBlocksExit()
。 Robot
有一些我也想要的方法。
我已经扩展了Robot
但是我还想要Thing
setBlocksExit()
。 我将创建一个具有setBlocksExit()
的接口,然后创建一个类似以下的类:
public class C extends Robot implements BlockExit {}
问题是我无法访问Thing
和Robot
的源代码。 我正在使用教育软件包'becker.jar' ,所有代码都已编译,因此我无法访问它来提取接口。 我有什么选择?
一种选择是将Robot
和Thing
包装在您自己的包装器类中
public class MyRobot extends Robot implements IBlockingObject
和
public class MyThing extends Thing implements IBlockingObject
您可以在其中强制界面
interface IBlockingObject{
void setBlocksExit(boolean blocksExit);
}
然后,您可以在代码中的其他IBlockingObject
可靠地使用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
调用委托给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.