2017-08-22 5 views
0

これを設定します。私が達成しようとしている何Javaは、私は現在、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クラスの名前。これは多くの幸運せずに次のことを試してみました、私の最高の推測はそれを設定する方法がわからスーパー()コマンドではなく、とにかくすることで可能です:

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! 

    } 

} 

私は何かが欠けているか、これは不可能であるだろうか?これを行う唯一の理由は、コード自体をよりきれいにすることです。私が思いつくことができる解決策は次のとおりです。

私は多くの変数を持っているので、動作するかもしれませんが、非常に醜いです。助けてくれてありがとう!

PS:誤解を招くタイトルで申し訳ありませんが、私は本当に何を呼び出すべきかわかりません!

+0

A)私は本当にあなたがやろうとしていることを理解していませんB)あなたの質問はおそらく広すぎます。基本的には、経験豊富な人があなたと座ってあなたの考えを話しています。たぶんあなたは戻って、まずその名前があなたのために何をすべきかを教えてください。他のクラスが直接読み書きすることができるクラスにフィールドを持つことは、最初は悪い考えです。 – GhostCat

+0

'name'のように、フィールドではなくゲッターでアクセスする必要があります。 'GameLoop'の実装は単に' game'オブジェクトに委譲すべきです。 –

+0

gameloopがゲームを拡張するので、パブリックインスタンス変数名が利用可能であり、その名前でアクセス可能でなければなりません。あなたはどんな問題を抱えていますか?スーパーを使うことは余計です。上記のように、パブリック変数ではなくゲッターを使用する方が安全かもしれません。 – ryonts

答えて

0

まず最初に、これらのクラスのやり方を修正する必要があります。

GameLoopGameのいずれかがあることを意味します。つまり、GameLoopもまたGameです。 GameクラスにGameLoopのインスタンスがあります。これは、コンストラクターで新しいGameLoopに設定されています。しかしGameLoopGameなので、新しいGameLoopを作成すると、新しいGameが作成され、コンストラクタが呼び出され、別のオブジェクトが作成されます。これは新しいオブジェクトを作成する無限ループなので、最終的には結果はa StackOverflowError

あなたは:GameLoopタイプがGameであることを決定する必要がありますか?または、 Gameには何かがありますか? (またはにはGameの何かがありますか?)GameLoopGameであるが、Gameではない場合は、GameLoopGameに拡張しないでください。 GameLoopが実際にGameのタイプである場合、GameLoopGameはおそらくお互いの参照を含んではいけません。

とにかく、それは本当に質問に答えないので、私はそれをやろうとします。ほとんどのコードでgame.nameを使用することを本当に嫌うなら、1つの方法はメソッドを使うことです。今

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

、クラスの残りの部分では、あなたはname()代わりのgame.nameを使用することができます。私は本当になぜこのようにしたいのかわからない。クラスが互いにどのように関係しているかを考えれば、すべてが不必要になることがあります。