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

标签 java oop inheritance ooad

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

代码如下:

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

    [...]

}

最佳答案

 public class Deck <T extends Card> 

Deck 扩展 Card。

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

这与 Java 的集合类相同,其中 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

关于java - 在一些 Java 代码中,为什么类 Deck 扩展 Card 类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10291323/

相关文章:

java - 使用 JavaFX 打开多个窗口

java - 如何添加数据库池 - Spring3、Hibernate、MySQL

java - 未找到 Junit 方法

java - 登录成功后如何获取用户名?

c++ - 如何遍历 C++ 类的所有子类(在编译时)?

java - 在两个不同的 JFrame 中打开的相同菜单仅适用于最后一个

javascript - V8不会优化超过4种对象类型?

Java:使用子级的成员变量调用父级的方法

c# - 如何强制派生类实现静态属性或字段?

python - 如何从不同的文件继承类?