在识别类本身后使用类函数

时间:2016-11-04 09:29:42

标签: java function class if-statement

我的当前代码存在问题。我想写一个简单的垄断式游戏来锻炼。完成它并不多,但我一直坚持下去。

我有一个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个字段都有价格标签),但是在我已经检查过该类是否等于运气之后我应该可以使用它,不应该我?

2 个答案:

答案 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}},因此您会收到正确的错误信息。基本上,有两种可能性:

  1. 将字段转换为price - branches
  2. 内的相应子类
  3. 将结果的处理委托给字段(正确的OO方式):

    if