初学者:在javaFx中扩展一个类

时间:2016-05-06 20:28:18

标签: java inheritance javafx javafx-8

我正在开发一个java游戏。对于我的游戏我设计了一个关卡。现在我想为我的游戏设计另一个关卡。如果我可以扩展我以前的关卡,对我的新关卡真的很有用。
在游戏中我正在进行各种级别的阶段更改。为此我必须扩展Application类。由于java不支持多重继承,有没有其他方法可以在不进行阶段更改的情况下进入不同的级别?

阶段变化:

    //LevelOne selection
    levelOneIm = new ImageView();
    levelOne = new Image("minion/image/levelOne.jpeg");
    levelOneIm.setImage(levelOne);
    levelOneIm.setTranslateX(300);
    levelOneIm.setTranslateY(200);
    levelOneIm.setOnMouseClicked(e -> { 
        popUp.show();
        popUpOk.setOnAction(ab -> {
            try {
                userName = popUpUserName.getText();
            } catch(Exception a){
                System.out.println("Exception handled");
            }     
            //Going to Main Game and popup stage closing
            Minion minion = new Minion();
            popUp.close();
            minion.gameRun = true;
            minion.start(stage);//Level1 stage change
    });
    });

    //LevelTwo selection
    levelTwoIm = new ImageView();
    levelTwo = new Image("minion/image/levelTwo.jpg");
    levelTwoIm.setImage(levelTwo);
    levelTwoIm.setTranslateX(500);
    levelTwoIm.setTranslateY(200);
    levelTwoIm.setOnMouseClicked(e -> { 
        popUp.show();
        popUpOk.setOnAction(ab -> {
            try {
                userName = popUpUserName.getText();
            } catch(Exception a){
                System.out.println("Exception handled");
            }     
            //Going to LevelTwo and popup stage closing
            LevelTwo levelTwo= new LevelTwo();
            popUp.close();
            levelTwo.gameRun = true;
            levelTwo.start(stage);
    });
    });     

级别1:

public class Minion extends Application implements Runnable{
    private Group root;
    private StackPane stackpane;
    private Scene mainbgscene;
    private ImageView mainbgv,heartIm1,heartIm2,heartIm3,characterIm,obsIm,obsIm2,obsIm3,obsIm4,obsIm5,obsIm6,obsIm7;
    private Image mainbg,heart1,character,obs,obs2,obs3,obs4,obs5,obs6,obs7;
    private VBox mainvbox,scoreVbox,characterVbox,obsVbox;
    private HBox heartHbox,scoreHbox;
    private Stage stageContainer;
    private Label scoreLabel;
    private Rectangle scoreBox;

级别2:

public class LevelTwo extends Application implements Runnable{
    private Group root;
    private StackPane stackpane;
    private Scene mainbgscene;
    private ImageView mainbgv,heartIm1,heartIm2,heartIm3,characterIm,obsIm,obsIm2,obsIm3,obsIm4,obsIm5,obsIm6,obsIm7;
    private Image mainbg,heart1,character,obs,obs2,obs3,obs4,obs5,obs6,obs7;
    private VBox mainvbox,scoreVbox,characterVbox,obsVbox;
    private HBox heartHbox,scoreHbox;
    private Stage stageContainer;
    private Label scoreLabel;
    private Rectangle scoreBox;
    private Runnable r1;
    private int characterBoundary,life;
    private boolean flag1 =true;
    private boolean obf1,obf2,obf3,obf4,obf5,obf6,obf7;
    private double characterX,characterY;
    public static int score,lastScore;

1 个答案:

答案 0 :(得分:2)

更改您的设计。重构您的应用程序以使用Single Responsibility Principle。应用程序不应该负责实现级别的逻辑,也不应该实现Runnable。您的应用程序类应仅负责实现JavaFX应用程序生命周期,如JavaFX application javadoc中所定义。实际上,您的应用程序应该是一个非常小的类。

相反,应该将实现游戏级别等任务委托给处理这些事情的其他类。 Favoring composition over inheritance可以让您更轻松地将不同的功能属性与项目相关联,而不是坚持严格且有时不灵活的层次结构,这可能会遇到问题和限制,例如diamond problem

对于可能看起来最适合通过多重继承来解决的问题的解决方案,您可以尝试使用twin pattern,这实际上只是本文中之前建议的一种委派形式。

要了解如何重构您的程序,研究面向对象的设计原则和技术,例如responsibility driven designcrc modeling,然后验证您的设计是否在运行时基础上相互配合使用一些简单的sequence diagrams。至于学习这些东西的书籍建议,也许会选择Object Design: Roles, Responsibilities, and Collaborations

的副本