2012-04-24 16 views
6

मैं जावा में कुछ कोड पढ़ रहा हूं, जिसे मैं परिचित नहीं हूं, लेकिन यह अजीब लगता है कि यदि कक्षा Deck (कार्ड के डेक के लिए) है, तो इसमें पहले से ही Cards की सरणी का एक आवृत्ति चर है, तो क्यों DeckCard का विस्तार या उत्तराधिकारी? मैंने सोचा कि कक्षा ए केवल कक्षा बी को विरासत में लेता है यदि ए बी है (बिल्ली पशु को विरासत में लेती है क्योंकि बिल्ली एक जानवर है)।कुछ जावा कोड में, क्लास डेक कार्ड क्लास का विस्तार क्यों करता है?

कोड के नीचे है:

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

    [...] 

} 

उत्तर

16
public class Deck <T extends Card> 

डेक कार्ड का विस्तार नहीं है।

यह एक सामान्य प्रकार की एनोटेशन है, और यह कहता है कि एक डेक टाइप टी का हो सकता है जहां टी कार्ड का उप-वर्ग है।

यह जावा के संग्रह वर्गों के समान है, जहां स्ट्रिंग की एक सूची स्ट्रिंग का विस्तार नहीं करती है (लेकिन स्ट्रिंग उदाहरण शामिल हैं)।

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

आपने मुझे इसे हराया। संकलन समय त्रुटि का अच्छा उदाहरण। – user949300

+0

मैं हमेशा अपने पोकरमैन कार्ड के साथ पोकर खेलता हूं, इसे और अधिक तीव्र बनाता है! – JustSid

0

आप इसे गलत तरीके से व्याख्या की:

यह आपको कोड की तरह लिखने के लिए अनुमति देता है। आपको टी के वर्ग डेक (जो कार्ड बढ़ाता है) पढ़ना चाहिए। इस तरह आपके पास List<Something> (कुछ की सूची) है जो आपके पास Deck<Cards> (कार्ड का एक डेक) है। यह Deck<PokerCard> भी हो सकता है, यदि पोकरकार्ड कार्ड

2

कक्षा डेक कार्ड का विस्तार नहीं करता है। इसमें कार्ड के एक ऐरेलिस्ट शामिल हैं।

<T extends Card> नोटेशन थोड़ा उलझन में है, लेकिन इसका मतलब है कि यह डेक टी द्वारा "पैरामीकृत" है, जिसे विस्तारित करना चाहिए, (कार्ड का उप-वर्ग होना चाहिए)। तो यह पिंचल कार्ड, ब्रिज कार्ड, टैरो कार्ड इत्यादि हो सकता है ... उदा।

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

एक कक्षा उस वर्ग के गुणों का उत्तराधिकारी बनने के लिए एक और कक्षा का विस्तार करती है। उदाहरण के लिए ।

Class A{ 

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

Class B extends A{ 

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

यह विरासत का काम है।

बिल्ली पशु का विस्तार करेगी क्योंकि बिल्ली जानवर का उप-समूह है, यह उस श्रेणी के अंतर्गत आ सकती है।

यहां डेक कार्ड का विस्तार नहीं करता है।

संबंधित मुद्दे