2012-04-30 4 views
3

子オブジェクトへの参照の配列を作成する必要があります。この場合、ルームはオブジェクトへの参照の配列を持っていなければなりません:DarkRoomLightRoom。行内にエラーがあり、配列Roomの初期化が行われました。何が欠けている?子オブジェクトへの参照の配列が初期化に失敗しました

public abstract class Room { 

    public Room[][] space = new Room[4][4]; // <<Syntax error on token ";", 

    space[0][0] = new DarkRoom(); 
    space[0][1] = new LightRoom(); 
    space[1][0] = new DarkRoom(); 
    space[1][1] = new LightRoom();    
} 

public class LightRoom extends Room { ... } 

public class DarkRoom extends Room { ... } 
+0

次の行が間違っています。一つの方法を入れてください! –

答えて

6

あなたのデザインが道的外れです。クラスは、子オブジェクトの配列を保持すべきではなく、実際にはその子クラスについての知識や依存性がないはずです。これは再帰的で論理的な悪夢の両方です。

私はあなたがRoomクラスの中からArrayやHouseクラスのような適切な場所に配列を削除することをお勧めします。

+1

+1面白い、質問に答えていない、まだここで最高の答え:) – MByD

+2

確かに構文を修正するよりも良い長期的なソリューションです。 – Thomas

4

初期化は、代わりに、初期化ブロックまたはメソッドの外でください行われるべきではありません。

public Room[][] space = new Room[4][4]; 
{ 
    space[0][0] = new DarkRoom(); 
    space[0][1] = new LightRoom(); 
    space[1][0] = new DarkRoom(); 
    space[1][1] = new LightRoom(); 
} 
+0

中括弧はRoomのコンストラクタのボディを定義しますか? –

+1

いいえ、初期化ブロックです。 – MByD

4

スペース[] []ブロックに不満があります。クラス定義にコードを書くだけでは意味がありません。

public abstract class Room { 

    public Room[][] space = new Room[4][4]; // << error Syntax error on token ";", 

    public Room() 
    { 
    space[0][0] = new DarkRoom(); 
    space[0][1] = new LightRoom(); 
    space[1][0] = new DarkRoom(); 
    space[1][1] = new LightRoom(); 
    } 
    }