在一些Java代码中,为什么Deck类会扩展Card类?

时间:2012-04-24 03:20:56

标签: java oop inheritance ooad

我正在阅读一些我不熟悉的Java代码,但似乎很奇怪,如果一个类是Deck(对于一副牌),它已经有一个数组的实例变量Cards,为什么Deck会延伸或继承Card?我认为只有当A是B时,A类才会继承B类(Cat因为猫是动物而继承动物)。

代码如下:

public class Deck <T extends Card> {
    private ArrayList<T> cards;
    private int dealtIndex = 0; // marks first undealt card

    public Deck() {
    }

    public void setDeckOfCards(ArrayList<T> deckOfCards) {
        cards = deckOfCards;
    }

    public void shuffle() {
        for (int i = 0; i < cards.size(); i++) {

    [...]
}

public abstract class Card {
    private boolean available = true;

    /* number or face that's on card - a number 2 through 10, 
     * or 11 for Jack, 12 for Queen, 13 for King, or 1 for Ace 
     */
    protected int faceValue;
    protected Suit suit;

    public Card(int c, Suit s) {
        faceValue = c;
        suit = s;
    }

    public abstract int value();

    public Suit suit() { 
        return suit; 
    }

    [...]

}

4 个答案:

答案 0 :(得分:17)

 public class Deck <T extends Card> 

Deck 扩展卡。

这是一个泛型类型注释,它表示Deck可以是T类型,其中T是Card的子类。

这与Java的集合类相同,其中List of String也不扩展String(但包含String实例)。

这允许您编写如下代码:

Deck<PokerCard> pokerDeck = new Deck<PokerCard>();

PokerCard c = pokerDeck.getTopCard();   
// now you know it is a PokerCard, not just any old card

pokerDeck.insert(new MagicTheGatheringCard()); 
// get a compile error for wrong card type

答案 1 :(得分:2)

班级不会延长卡。它包含一个ArrayList of Cards。

<T extends Card>符号有点令人困惑,但这意味着这个Deck被T“”参数化“,它必须扩展(卡的子类)。所以它可能是Pinochle卡,桥牌,塔罗牌等......例如。

Deck myTarot = new Deck<TarotCard>();

答案 2 :(得分:0)

你用错误的方式解释它。您应该阅读T类课程(扩展卡片)。就像这样你有一个List<Something>(某事物清单)你在这里Deck<Cards>(一副牌)。如果PokerCard扩展了卡

,这也可能是Deck<PokerCard>

答案 3 :(得分:0)

当一个类想要继承该类的属性时,它会扩展另一个类。 例如。

Class A{

public void show()
{
//something to show
}
}

Class B extends A{

//B can now enjoy the show() function defined by A
}

这是继承的工作方式。

Cat会扩展Animal,因为cat是动物的一个子集,它可以属于该类别。

这里Deck没有延长卡片。