4

ゲームを作っています。ゲームには GameMap があります。GameMap 上の物事の状態を追跡するために、それらのそれぞれに対して ArrayLists を作成したいと考えました。問題は、ArrayList の各タイプからアイテムを追加または削除するための個別のメソッドを作成する必要がないことです。私は初心者なので、もちろん最初に思いつくのは「instanceof」演算子です。

現在、GameMap は個別のクラスであり、インターフェイスや抽象クラスではないことに注意してください。その意図は、ゲームの初期化時に GameMap オブジェクトをインスタンス化することです。

public class GameMap {

//GameMap has a name
private String mapName;

//GameMap has rooms
private ArrayList<Room> roomsOnMap;

//GameMap has items
private ArrayList<Item> itemsOnMap;

//GameMap has people
private ArrayList<Person> peopleOnMap;

//construct GameMap with rooms, items, and people
private GameMap(String mapName, ArrayList someRooms, ArrayList someItems, ArrayList somePeople)
{
    this.mapName = mapName;
    this.roomsOnMap = someRooms;
    this.itemsOnMap = someItems;
    this.peopleOnMap = somePeople;
}

public void addObject(Object o)
{
    //HOW DO I AVOID THIS?
    if(o instanceof Room)
    {
        roomsOnMap.add((Room) o);
    }
    else if(o instanceof Item)
    {
        itemsOnMap.add((Item) o);
    }
    else if(o instanceof Person)
    {
        peopleOnMap.add((Person) o);
    }
}
4

4 に答える 4

6

オーバーロードされたメソッドを使用します:

void addObject(Room room) {
  roomsOnMap.add(room);
}

void addObject(Item item) {
  itemsOnMap.add(item);
}

..
于 2013-01-19T21:58:48.393 に答える
2

ここに1つのトリックがあります:

Map<Class, ArrayList> map = new HashMap<Class, ArrayList>();
map.put(Room.class, roomsOnMap);
map.put(Item.class, itemsOnMap);
map.put(Person.class, peopleOnMap);

// ...

public void addObject(Object o)
{
    map.get(o.getClass()).add(o); // be aware of NullPointerException here
}

ただし、これにはオーバーロードされたメソッドを使用することをお勧めします。

于 2013-01-19T22:02:52.493 に答える
2

instanceOfあまり良い考えではないかもしれないというあなたの勘は正しいです。

ルーム、アイテム、および人物が何らかの種類の " GameElements" または " MapElements" である場合、共通の親を介してそれらの間に関係を持たせることができます。

enum ElementType
{
    PERSON, ITEM, ROOM;
}

interface MapElement
{
    public ElementType getType();
}

class Room implements MapElement
{
    public ElementType getType()
    {
        return ElementType.ROOM;
    }
    //other attributes and methods...
}

class Person implements MapElement
{
    public ElementType getType()
    {
        return ElementType.PERSON;
    }
    //other attributes and methods...
}

class Item implements MapElement
{
    public ElementType getType()
    {
        return ElementType.ITEM;
    }
    //other attributes and methods...
}

その後、addメソッドはこのインターフェイスで動作できます

public void addObject(MapElement e)
{
    if(e.getType == ElementType.Room)
    {
        roomsOnMap.add((Room) e);
    }
    ...
}

これは、要素が関連している場合にのみ行ってください。そうでない場合は、別の方法が必要です。これを行うための単一のメソッドを持つことは効率的に見えるかもしれませんが、何も得られません。このクラスを使用するすべてのクラス (およびそれを作成する開発者) にとって、個別の add メソッド (要素が関連していない場合) はObject、パラメーターとして一般的な add を使用するよりも直感的です。実際、クラスとメソッドがより単純になったとしても、数行のコードでさえ失うことはありません。

于 2013-01-19T22:03:31.687 に答える
1

使用を避けたい場合は、設計パターンをinstanceof試してください。Visitor

ここでその説明を見つけることができます: http://www.oodesign.com/visitor-pattern.html

于 2013-01-19T21:59:24.270 に答える