我目前正在用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:对不起,误导性的标题,我真的不知道该怎么称呼它!
首先要做的是:你需要修复你做这些类的方式。
你必须GameLoop
扩展Game
,这意味着任何GameLoop
本身也是Game
。Game
类中有一个GameLoop
实例,在构造函数中将其设置为新GameLoop
。 但是GameLoop
是一个Game
,所以当你创建一个新的GameLoop
时,你正在创建一个新的Game
,它调用构造函数,构造函数创建另一个...这是一个创建新对象的无限循环,最终的结果是StackOverflowError
。
您需要决定:GameLoop
是一种Game
吗? 还是GameLoop
是Game
拥有的东西? (或者,也许,Game
是GameLoop
拥有的东西吗? 如果GameLoop
是Game
拥有的东西,但不是Game
,那么GameLoop
不应该扩展Game
。 如果GameLoop
实际上是一种Game
,那么GameLoop
和Game
可能不应该包含对彼此的引用。
无论如何,这并不能真正回答这个问题,所以我会尝试这样做。 如果您确实不喜欢在大多数代码中使用game.name
,一种替代方法是使用方法。
private String name()
{
return game.name;
}
现在,在类的其余部分,您可以使用name()
而不是game.name
。 不过,我真的不确定你为什么要这样做。 一旦你重新思考你的类是如何相互关联的,整个事情可能会变得没有必要。