2012-04-24 17 views
6

Czytam kod w Javie, który nie jest mi znany, ale wydaje się dziwne, że jeśli klasa jest Deck (dla talii kart), ma już zmienną instancji tablicy Cards, więc dlaczego Deck przedłużyć lub odziedziczyć Card? Myślałem, że klasa A dziedziczy klasę B tylko wtedy, gdy A jest B (kot dziedziczy zwierzę, ponieważ kot jest zwierzęciem).W jakimś kodzie Java, dlaczego talię klas rozszerza klasę kart?

Kod jest poniżej:

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

    [...] 

} 

Odpowiedz

16
public class Deck <T extends Card> 

Deck nie wykracza Card.

Jest to adnotacja typu ogólnego, która mówi, że Tal może być typu T, gdzie T jest podklasą karty.

Jest to to samo co klasy kolekcji Java, w których lista ciągów również nie rozszerza łańcucha (ale zawiera instancje String).

To pozwala na pisanie kodu, takich jak:

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

Uderzyłeś mnie do tego. Ładny przykład błędu czasu kompilacji. – user949300

+0

Zawsze gram w pokera z moimi kartami Pokemon, dzięki czemu gra jest o wiele bardziej intensywna! – JustSid

0

można interpretować go w niewłaściwy sposób. Powinieneś przeczytać klasę Deck of T (która rozszerza Card). Podobnie jak masz List<Something> (lista czegoś) masz tutaj Deck<Cards> (talię kart). To może być również Deck<PokerCard>, jeśli PokerCard rozciąga karty

2

Klasa pokład nie obejmuje karty. Zawiera zawiera ArrayList of Cards.

Notacja jest trochę zagmatwana, ale oznacza to, że ta Talia jest "sparametryzowana" przez T, która musi rozciągać się (być podklasą) kart. Mogą to być karty Pinochle, Bridge Cards, Karty Tarota itp.

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

Klasa rozszerza kolejną klasę, gdy chce dziedziczyć właściwości tej klasy. dla np.

Class A{ 

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

Class B extends A{ 

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

Tak właśnie działa dziedziczenie.

Kot rozszerzy zwierzę, ponieważ kot jest podgrupą zwierząt, może znaleźć się w tej kategorii.

Tutaj pokład nie rozszerza karty.

Powiązane problemy