2012-04-24 8 views
6

Estoy leyendo un código en Java, con el que no estoy familiarizado, pero parece extraño que si una clase es Deck (para una baraja de cartas), ya tiene una variable de instancia de una matriz de Cards, entonces ¿por qué Deck ¿extender o heredar Card? Pensé que la clase A hereda la clase B solo si A es B (el gato hereda a Animal porque un gato es un animal).En algunos códigos Java, ¿por qué la clase Deck extiende la clase de la Tarjeta?

El código es el siguiente:

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

    [...] 

} 

Respuesta

16
public class Deck <T extends Card> 

cubierta no extender la tarjeta.

Esta es una anotación de tipo genérico, y dice que un Deck puede ser de tipo T donde T es una subclase de Card.

Esto es lo mismo que las clases de colección de Java, donde una lista de cadenas tampoco extiende la cadena (pero contiene instancias de cadenas).

Esto le permite escribir código como:

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

Me lo ganaste. Buen ejemplo del error de tiempo de compilación. – user949300

+0

¡Siempre juego Poker con mis cartas de Pokemon, lo hago mucho más intenso! – JustSid

0

Es interpretado por el camino equivocado. Debes leer la clase Deck of T (que extiende Card). Al igual que tiene una List<Something> (lista de algo) que tiene aquí Deck<Cards> (una baraja de cartas). Eso podría ser también un Deck<PokerCard>, si PokerCard extiende la tarjeta

2

El mazo de clase no extiende la tarjeta. Contiene contiene un ArrayList of Cards.

La notación <T extends Card> es un poco confusa, pero significa que este Deck está "parametrizado" por T, que debe extender, (ser una subclase de) Cartas. Por lo tanto, podrían ser tarjetas Pinochle, tarjetas puente, cartas de tarot, etc. ... p.

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

Una clase amplía otra clase cuando quiere heredar propiedades de esa clase. por ej.

Class A{ 

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

Class B extends A{ 

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

Así es como funciona la herencia.

El gato extenderá Animal porque, cat es un subconjunto de animal, puede pertenecer a esa categoría.

Aquí la cubierta no extiende la tarjeta.

Cuestiones relacionadas