Java 无源代码的多重继承
Java Multiple Inheritance without Source Code
我有一个叫 Thing
的 class 和一个叫 Robot
的 class。 Thing
有一个 public void setBlocksExit()
。 Robot
有一些我也想要的方法。
我已经扩展了 Robot
,但我还想从 Thing
扩展 setBlocksExit()
。我会制作一个具有 setBlocksExit()
的界面,然后制作一个 class,例如:
public class C extends Robot implements BlockExit {}
问题是我无法访问 Thing
和 Robot
的源代码。我正在使用教育包 'becker.jar' 并且所有代码都已编译,因此我无法访问它来提取接口。我有哪些选择?
一种替代方法是将 Robot
和 Thing
包装在您自己的包装器 classes
中
public class MyRobot extends Robot implements IBlockingObject
和
public class MyThing extends Thing implements IBlockingObject
在哪里你可以强制界面
interface IBlockingObject{
void setBlocksExit(boolean blocksExit);
}
然后您可以在代码的其他地方可靠地使用 IBlockingObject
,而不会产生太多开销。
另一种选择是使用 Robot
和 Thing
作为成员字段
组成一个 class
类似于
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
对象。
- 创建一个新的 class 并引用
Robot
和引用 Thing
并委托对这两个对象的调用。
如果您使用的是 IDE,例如 Eclipse,您甚至可以 "extract interfaces" 并自动生成委托方法。
选项 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,则可以使用此功能:
- Fast implement wrapping (delegate methods) in Eclipse?
我确定您使用的 IDE 具有类似的功能。
我有一个叫 Thing
的 class 和一个叫 Robot
的 class。 Thing
有一个 public void setBlocksExit()
。 Robot
有一些我也想要的方法。
我已经扩展了 Robot
,但我还想从 Thing
扩展 setBlocksExit()
。我会制作一个具有 setBlocksExit()
的界面,然后制作一个 class,例如:
public class C extends Robot implements BlockExit {}
问题是我无法访问 Thing
和 Robot
的源代码。我正在使用教育包 'becker.jar' 并且所有代码都已编译,因此我无法访问它来提取接口。我有哪些选择?
一种替代方法是将 Robot
和 Thing
包装在您自己的包装器 classes
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);
}
}
我想第一个对你来说更灵活 运行。
您的选择如下:
- 扩展
Thing
并引用一个Robot
,您将所有Robot
方法委托给它。 - 扩展
Robot
并引用您委托setBlocksExit
调用的Thing
对象。 - 创建一个新的 class 并引用
Robot
和引用Thing
并委托对这两个对象的调用。
如果您使用的是 IDE,例如 Eclipse,您甚至可以 "extract interfaces" 并自动生成委托方法。
选项 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,则可以使用此功能:
- Fast implement wrapping (delegate methods) in Eclipse?
我确定您使用的 IDE 具有类似的功能。