【问题标题】:Java set this to super argumentJava将此设置为超级参数
【发布时间】:2017-08-23 02:20:14
【问题描述】:

我目前正在用 Java 开发一个游戏,我有以下代码:

public class Game extends Thread {
    public String name = "randomName";
    public int state=0;

    public GameLoop gameLoop;

    public Game(){
        gameLoop = new GameLoop(this);
    }

    public void run(){ // when the thread starts
        name="UpdatedName";
    }
}


public class GameLoop extends Game{

    public GameLoop(Game game){

        System.out.println(game.name); //UpdatedName
        System.out.println(name); // randomName, I want UpdatedName here!

    }

}

我想要实现的是能够在 GameLoop 类中使用“name”而不是 game.name。无论如何,这是否可能,我最好的猜测是 super() 命令,但不确定如何设置它,尝试了以下没有太多运气:

public class Game extends Thread {


    public String name = "randomName";
    public int state=0;

    public GameLoop gameLoop;

    public Game(Game game){
        this = game;
    }

    public Game(){
        gameLoop = new GameLoop(this);
    }

    public void run(){ // when the thread starts
        name="UpdatedName";
    }
}

public class GameLoop extends Game{

    public GameLoop(Game game){
        super(game);
        System.out.println(game.name); //UpdatedName
        System.out.println(name);  too!

    }

}

我错过了什么还是不可能?这样做的唯一原因是使代码本身更干净。我能想出的唯一解决方案是:

 public class Game extends Thread {

    public String name = "randomName";
    public int state=0;

    public GameLoop gameLoop;

    public Game(Game game){
        name = game.name;
        state = game.state;
        // ...
    }

    public Game(){
        gameLoop = new GameLoop(this);
    }

    public void run(){ // when the thread starts
        name="UpdatedName";
    }
}

这可能有效但非常难看,因为我有很多变量。谢谢你的帮助!

PS:抱歉标题误导了,我真的不知道该怎么称呼它!

【问题讨论】:

  • A) 我不太明白你打算做什么 B) 你的问题可能太宽泛了。基本上,你会是一个有经验的人和你坐下来谈论你的想法......以及解决方案......几个小时。也许您可以退后一步,先告诉我们name 应该为您做什么。你看 - 在一个类中拥有一个 other 类可以直接读取或写入的字段首先是一个坏主意....
  • 听起来name 应该通过getter 而不是字段来访问,GameLoop 的实现应该只委托给game 对象。
  • 由于 gameloop 扩展了游戏,公共实例变量名称可用并且应该可以通过该名称访问。你看到了什么问题?使用 super 是多余的;如上所述,与公共变量相比,使用 getter 可能更安全
  • 如果它是一个扩展对象,getter 是不必要的
  • 你的继承没有任何意义。此外,您应该考虑实现Runnable 接口,而不是扩展Thread

标签: java class super


【解决方案1】:

首先要做的是:你需要修正你做这些课程的方式。

你有GameLoop扩展Game,这意味着任何GameLoop本身也是Game。您的Game 类中有一个GameLoop 的实例,您在构造函数中将其设置为新的GameLoop。但是GameLoopGame,所以当你创建一个新的GameLoop 时,你正在创建一个新的Game,它调用构造函数,它创建另一个......这是一个创建新对象的无限循环,结果最终是StackOverflowError

您需要确定:GameLoopGame 的类型吗?还是GameLoopGame 拥有的东西? (或者,也许,GameLoop 拥有 Game 的东西?)如果 GameLoopGame 拥有的东西,但不是 Game,那么 GameLoop 不应该扩展Game。如果GameLoop 实际上是Game 的一种类型,那么GameLoopGame 可能不应该包含对彼此的引用。

无论如何,这并不能真正回答问题,所以我会尝试这样做。如果您真的不喜欢在大部分代码中使用game.name,则另一种选择是使用方法。

private String name()
{
    return game.name;
}

现在,在课程的其余部分,您可以使用 name() 代替 game.name。不过,我真的不确定您为什么要这样做。一旦你重新考虑你的类是如何相互关联的,整个事情可能就变得不必要了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-02-11
    • 1970-01-01
    • 2012-01-29
    • 1970-01-01
    • 2018-01-25
    • 1970-01-01
    • 2012-11-21
    相关资源
    最近更新 更多