我的当前代码存在问题。我想写一个简单的垄断式游戏来锻炼。完成它并不多,但我一直坚持下去。
我有一个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;
}
}
我有以下问题。我创建并将它们存储在List中(如图所示,列表中的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课程&#39;以下代码后的函数?
if (f.getClass().equals(Luck.class)) {
player.income(fields.get(player.getPosition()).getPrice());
}
错误是它无法找到我理解的价格符号。它没有在Fields.java中声明(因为并非所有3个字段都有价格标签),但是在我已经检查过该类是否等于运气之后我应该可以使用它,不应该我?
答案 0 :(得分:2)
我怎么能使用Luck课程&#39;
之后的功能
该具体问题的答案是:您 将f
投射到Luck
:
((Luck)f).getPrice()
e.g:
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
。
答案 1 :(得分:0)
在if
中,您不会将字段强制转换为相应的子类,但继续使用不包含Field
的{{1}},因此您会收到正确的错误信息。基本上,有两种可能性:
price
- branches 将结果的处理委托给字段(正确的OO方式):
if