[英]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.