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

这是一个技巧:

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可能不是一个很好的主意是正确的。

如果 Room、Items 和 Persons 是某种“ 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 方法(如果元素不相关)比使用通用 addObject作为参数更直观。你不会丢失任何东西,即使是几行代码,如果事实上你的类和方法变得更加简单。

于 2013-01-19T22:03:31.687 回答
1

如果你想避免使用instanceof尝试Visitor设计模式。

在这里你可以找到它的描述:http ://www.oodesign.com/visitor-pattern.html

于 2013-01-19T21:59:24.270 回答