【问题标题】:In some Java code, why does the class Deck extend the Card class?在一些 Java 代码中,为什么类 Deck 扩展了 Card 类?
【发布时间】:2012-05-04 16:49:15
【问题描述】:

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

代码如下:

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

    [...]

}

【问题讨论】:

    标签: java oop inheritance ooad


    【解决方案1】:
     public class Deck <T extends Card> 
    

    Deck 扩展 Card。

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

    这与 Java 的集合类相同,其中 String 的 List 也不扩展 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
    

    【讨论】:

    • 我总是用我的口袋妖怪卡来玩扑克,这让我变得更加激烈!
    【解决方案2】:

    类套牌不扩展卡片。它包含一个卡片的 ArrayList。

    &lt;T extends Card&gt; 表示法有点令人困惑,但这意味着这个 Deck 是由 T“参数化”的,它必须扩展 Cards(是 Cards 的子类)。所以它可能是皮诺奇卡、桥牌、塔罗牌等......例如

    Deck myTarot = new Deck<TarotCard>();
    

    【讨论】:

      【解决方案3】:

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

      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不扩展卡。

      【讨论】:

        【解决方案4】:

        你解释错了。你应该阅读 class Deck of T(扩展 Card)。就像你有一个List&lt;Something&gt;(一些东西的列表)你在这里有Deck&lt;Cards&gt;(一副牌)。如果 PokerCard 扩展 Card,那也可能是 Deck&lt;PokerCard&gt;

        【讨论】:

          猜你喜欢
          • 2014-12-08
          • 1970-01-01
          • 1970-01-01
          • 2011-04-20
          • 2013-08-12
          • 1970-01-01
          • 2016-03-27
          • 1970-01-01
          • 2021-02-07
          相关资源
          最近更新 更多