我当前的代码有问题。我想写一个简单的类似垄断的游戏来锻炼身体。没有什么可以完成的,但是我只坚持一件事。

我有一个Field类,该类由Luck,Property和Service类扩展。运气和服务几乎是一样的。

package field;

public class Luck extends Field {
    private final int price;

    public Luck(int price) {
        this.price = price;
    }

    public int getPrice() {
        return price;
    }
}


我有以下问题。我将它们创建并存储在一个列表中(随着地图的移动,0。列表中的元素是地图上的1.字段,1.元素是2.字段,依此类推)

List<Field> fields = new ArrayList<>();


现在,如果有一个玩家掷骰子然后移动,我应该检查他是否在“运气”或“服务”字段上踩到,以便我可以得到他的钱。

Field f = fields.get(player.getPosition());

if (f.getClass().equals(Luck.class)) {
    player.income(fields.get(player.getPosition()).getPrice());

} else if (f.getClass().equals(Service.class)) {
    player.expense(fields.get(player.getPosition()).getPrice());

} else {}


播放器如下所示:

public abstract class Player {
    String name;
    private int wealth;
    private int position;

    public Player(String name) {
        this.name = name;
        wealth = 10000;
        position = 0;
    }

    public void expense(int price) {
        wealth -= price;
    }

    public void income(int price) {
        wealth += price;
    }


在以下代码之后,我如何使用Luck类的函数?

if (f.getClass().equals(Luck.class)) {
    player.income(fields.get(player.getPosition()).getPrice());
}


错误是找不到我理解的价格符号。它没有在Fields.java中声明(因为不是所有3个字段都带有价格标签),但是在检查了类是否等于Luck之后,我应该可以使用它,不是吗?

最佳答案

之后如何使用Luck类的功能


该特定问题的答案是:您将f强制转换为Luck

((Luck)f).getPrice()


例如。:

if (f.getClass().equals(Luck.class)) { player.income(((Luck)f).getPrice()); }
// --------------------------------------------------^^^^^^^-^


(请注意,我在这里重用了f,而不是再次从列表中获取它。)

您可能还会查看instanceof而不是getClass().equals(...)



但是,如果您发现自己经常使用instanceof(或getClass().equals(...))进行转换,则值得退后一步,看看是否可以重新设计结构以使用通用接口,这样您就不必真正在乎实例,您只是要求它执行其操作。

例如,您可能(这只是现成的)具有这样的接口:

interface ActionOnPlayer {
    void performAction(Player p);
}


...由Luck声明但未实现(使Luck为抽象类)。 (或者performAction可能是Luck上的抽象方法。)

然后代替

if (f.getClass().equals(Luck.class)) { player.income(fields.get(player.getPosition()).getPrice()); }
else if (f.getClass().equals(Service.class)) { player.expense(fields.get(player.getPosition()).getPrice()); }
else {}


你会

f.performAction(player);


...每个具体类以相关方式实现performAction的地方。

09-07 00:05