2012-04-24 9 views
6

Sto leggendo del codice in Java, che non conosco, ma sembra strano che se una classe è Deck (per un mazzo di carte), ha già una variabile di istanza di una matrice di Cards, quindi perché Deck estendere o ereditare Card? Pensavo che la classe A erediti la classe B solo se A è un B (il gatto eredita l'animale perché un gatto è un animale).In qualche codice Java, perché il class deck estende la classe Card?

Il codice è qui sotto:

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

    [...] 

} 

risposta

16
public class Deck <T extends Card> 

Deck non estende card.

Questa è un'annotazione di tipo generico e dice che un Deck può essere di tipo T dove T è una sottoclasse di Card.

Questo è lo stesso delle classi di raccolta Java, dove anche un elenco di stringhe non estende String (ma contiene istanze String).

Questo permette di scrivere codice come:

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 
+0

Mi hai battuto. Bel esempio dell'errore del tempo di compilazione. – user949300

+0

Gioco sempre a poker con le mie carte Pokemon, lo rende molto più intenso! – JustSid

0

È interpretato nel modo sbagliato. Dovresti leggere la classifica Deck of T (che estende Card). Così hai uno List<Something> (elenco di qualcosa) che hai qui Deck<Cards> (un mazzo di carte). Potrebbe anche essere un Deck<PokerCard>, se la PokerCard estende la carta

2

Il mazzo di classe non estende la carta. Contiene contiene una lista di carte Array.

La notazione <T extends Card> è un po 'confusa, ma significa che questo Deck è "parametrizzato" da T, che deve estendere (essere una sottoclasse di) Carte. Quindi potrebbe essere Pinochle Cards, Bridge Cards, Tarot Cards ecc ... ad es.

Deck myTarot = new Deck<TarotCard>(); 
0

Una classe estende un'altra classe quando vuole ereditare le proprietà di quella classe. per es.

Class A{ 

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

Class B extends A{ 

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

Ecco come funziona l'ereditarietà.

Cat estenderà Animale perché, il gatto è un sottoinsieme di animale, può rientrare in quella categoria.

Qui Deck non estende la carta.

Problemi correlati