簡體   English   中英

沒有源代碼的Java多重繼承

[英]Java Multiple Inheritance without Source Code

我有一個名為Thing的課程和一個名為Robot的課程。 Thing具有公共無效setBlocksExit() Robot有一些我也想要的方法。

我已經擴展了Robot但是我還想要Thing setBlocksExit() 我將創建一個具有setBlocksExit()的接口,然后創建一個類似以下的類:

public class C extends Robot implements BlockExit {}

問題是我無法訪問ThingRobot的源代碼。 我正在使用教育軟件包'becker.jar' ,所有代碼都已編譯,因此我無法訪問它來提取接口。 我有什么選擇?

一種選擇是將RobotThing包裝在您自己的包裝器類中

public class MyRobot extends Robot implements IBlockingObject

public class MyThing extends Thing implements IBlockingObject

您可以在其中強制界面

interface IBlockingObject{
   void setBlocksExit(boolean blocksExit);
}

然后,您可以在代碼中的其他IBlockingObject可靠地使用IBlockingObject ,而無需太多開銷。

另一種選擇是組成一個以RobotThing作為成員字段的類

就像是

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM