在这种情况下如何避免类型检查

问题描述 投票:0回答:1

情况如下:

我们有一个游戏,其中有玩家和物品。当玩家拥有库存中的所有3个特定物品并进行组装(地图上每个物品只有1个)时,便会赢得比赛。物品具有非常简单的界面,玩家可以在其上调用use()。如果我要忽略基本的OOP原则,我可以说,当玩家使用其中的一种时,我们将遍历玩家的库存,并检查其中是否包含所有这三种特定类型的物品。如何避免这样做?

public interface Item{
    public void use();
}

public class SpecificItem1 implements Item{
    public void use(){...}
}

public class SpecificItem2 implements Item{
    public void use(){...}
}

public class SpecificItem3 implements Item{
    public void use(){...}
}

public class Player{

    ArrayList<Item> inventory;

    public void didWeWin() {

        int numOfSItems = 0;

        for(Item i : inventory) {
            if(i instanceOf SpecificItem1)
                numOfSItems++;
            if(i instanceOf SpecificItem2)
                numOfSItems++;
            if(i instanceOf SpecificItem3)
                numOfSItems++;
        }

        if(numOfSItems == 3)
            win();
    }

}
java typechecking
1个回答
2
投票
public void didWeWin() { if (inventory.stream().map(Object::getClass).distinct().count() == 3L) { win(); } }
© www.soinside.com 2019 - 2024. All rights reserved.