2016-11-04 73 views
0

我的當前代碼有問題。我想寫一個簡單的類似壟斷的遊戲來練習。沒有太多要完成它,但我堅持一件事。識別類別本身後使用類功能

我有一個由Luck,Property和Service類擴展的Field類。運氣和服務幾乎是一樣的。

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; 
    } 

我怎麼會用運氣類的功能,下面的代碼後?

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

錯誤是它找不到價格符號,我明白了。它沒有在Fields.java中聲明(因爲並不是所有的3字段都有價格標籤),但是我應該能夠在我已經檢查過類是否等於Luck後使用它了,不是嗎?

回答

2

我怎麼會用運氣類的功能後

這個問題的答案的具體問題是:你fLuck

((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

0

在您的if中,您不會將該字段投射到相應的子類中,但會繼續使用Field而不包含price,因此您會收到正確的錯誤消息。基本上,有兩種可能性:

  1. 角色字段到if的內部的各亞類-branches
  2. 代表將結果提供給場的處理(適當的OO方式):

    Field f = fields.get(player.getPosition()); 
    f.visit(player); 
    
    // ... 
    
    public abstract class Field { 
    
        public abstract void visit(Player player); 
    } 
    
    // ... 
    
    public class Luck extends Field { 
    
        public void visit(Player player) { 
         player.income(this.price); 
        } 
    }    
    
    // ... 
    
    public class Service extends Field { 
    
        public void visit(Player player) { 
         player.expense(this.price); 
        } 
    }