2014-04-30 28 views
3

我嘗試設計一個關於撲克牌的項目。我有一個類卡Java中的枚舉和多態性,撲克牌示例

class Card 
{ 
    Rank rank; 
    Suit suit; 
} 

該西裝是一個枚舉。

enum Suit { .... } 

Rank應該有一個方法getValue()。 我想有多個Ranks,即。 BlackJackRank和PokerRank。所以我使用方法getValue和兩個實現此接口的枚舉BlackJackRank和PokerRank創建了一個接口Rank。

enum BlackJackRank implements Rank 
{ 
    ACE(1),DEUCE(2),THREE(3) .... 
    private final int value; 
    private BackJackRank(int value) { ... } 

    @Override 
    public int getValue() { ... } 
} 

我的問題是我不能調用rank.name()和rank.ordinal()的卡類,因爲排名不枚舉。任何想法?

+1

什麼是'BlackJackRank'的責任?爲什麼你喜歡將它們建模爲'enum'?也許我們可能會解決你的問題,如果我們明白你想要達到什麼,除了Java的實現。此外:'enum.values()是枚舉類型的獨佔方法,就像一個靜態方法,它只適用於你在''處調用''的類型。 – Harmlezz

+1

這裏有一個更好的方法是依賴注入,如果你足夠關心它的學習。 –

+0

@MichałSzydłowski:謹慎地闡述? – Thilo

回答

4

現在你改變的問題後,這裏是應該工作了答案:

class Card<T extends Enum<T> & Rank> { 

    private final T rank; 

    public Card(T rank) { 
     this.rank = rank; 
    } 

    public int getRankOrdinal() { 
     return rank.ordinal(); 
    } 

    public int getRankValue() { 
     return rank.getValue(); 
    } 
} 

interface Rank { 
    public int getValue(); 
} 

enum BlackJackRank implements Rank { 

    ACE(1); 

    private final int value; 

    private BlackJackRank(int value) { 
     this.value = value; 
    } 
    @Override public int getValue() { 
     return value; 
    } 
}