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