R1st さんが書きました:
この時、Fieldクラスは「a1.now()」を呼び出すことができません。
インナークラスで別のインナークラスのメソッドを呼び出したいのですが、どのように記述すればよいのでしょうか?
まず、Player a1がStartメソッドで定義されているのでStartメソッドを抜けると参照する(全てのメソッドから)ことが出来なくなりますので、Mainクラスのフィールドにしましょう。
また、インナークラスからアウタークラスのフィールドを参照するにはアウタークラスのフィールドがfinal修飾されている必要があります。
ですので、これらに従って書くと次のようになります。
コード:
public class Main
{
private final Player a1 = new Player();
public void start()
{
new Field().lifePaint();
}
public class Player
{
private int life = 10;
public int now()
{
if(life < 0) life = 0;
return life;
}
}
public class Field extends Graph
{
public void lifePaint()
{
Graph.paint(a1.now());
}
}
}
ただ、この設計だとダサいので僕だと次のようにします(インナークラスを絶対に使うのであれば・・・)
コード:
public class Main
{
public void start()
{
Player a1 = new Player();
new Field(a1).lifePaint();
}
public class Player // Mainクラス以外から呼ばれる必要がないのであればprivateにした方が良い
{
private int life = 10;
public int now()
{
if(life < 0) life = 0;
return life;
}
}
public class Field extends Graph // Mainクラス以外から呼ばれる必要がないのであればprivateにした方が良い
{
private Player a1;
public Field(Player a1)
{
this.a1 = a1;
}
public void lifePaint()
{
Graph.paint(a1.now());
}
}
}
(インナークラスである必要が全く無くなっているようにも感じますが・・・)
[hr]
[修正]
一つ目のコードのstartメソッドの戻り値の型が抜けていたので修正。
[追記]
Player a1をstartメソッドの外に出したくないのであれば次のようなことも可能です。
コード:
public class Main
{
public void start()
{
final Player a1 = new Player();
class Field extends Graph // 無名クラスにしてしまう手も・・・
{
public void lifePaint()
{
Graph.paint(a1.now());
}
}
new Field().lifePaint();
}
public class Player
{
private int life = 10;
public int now()
{
if(life < 0) life = 0;
return life;
}
}
}
[修正]三個目のコードのField.lifePaintメソッドでGraph.paintメソッドを呼び出してなかったので修正