الصنف Deck

في الفصل السابق، اشتغلنا مع مصفوفة كائنات، لكنني ذكرت أيضاً أنه من الممكن وجود كائن يحتوي مصفوفة كمتغير حالة. في هذا الفصل سننشئ كائن Deck الذي يحتوي على مصفوفة Cards.
سيبدو تعريف الصنف كما يلي:
كود:
class Deck {
   Card[] cards;
   public Deck(int n) {
      this.cards = new Card[n];
   }
}
يهيئ الباني متغير الحالة بمصفوفة من الأوراق، لكنه لا ينشئ أية أوراق. هنا نجد مخطط حالة يبين مظهر Deck بدون أوراق:
http://file.topmaxtech.net/images/ph...3962709351.jpg
هنا يوجد باني بدون متحولات يأخذ مجموعة ورق (deck) من 52 ورقة ويملأها بالأوراق (Cards):
كود:
public Deck() {
   this.cards = new Card[52];
   int index = 0;
   for (int suit = 0; suit <= 3; suit++) {
      for (int rank = 1; rank <= 13; rank++) {
         cards[index] = new Card(suit, rank);
         index++;
      }
   }
}
هذه العملية مشابهة للعملية makeDeck؛ لقد غيرنا البنية قليلاً لنجعلها عملية بناء. لاستدعائها، نستخدم new:
Deck deck = new Deck();
الآن سيكون من المعقول أن نضع العمليات المتعلقة بمجموعات الورق في تعريف الصنف Deck. بالنظر إلى العمليات التي كتبناها حتى الآن، أحد المرشحين الواضحين هي printDeck (القسم 13.7). ها هي هنا، بعد التعديل لتعمل مع Deck:
كود:
public static void printDeck(Deck deck) {
   for (int i=0; i < deck.cards.length; i++) {
      Card.printCard(deck.cards[i]);
   }
}
أحد التغييرات هو نوع المعامل، من Card[] إلى Deck.
التغيير الثاني هو عدم قدرتنا على استخدام deck.length بعد ذلك للحصول على طول المصفوفة، لأن deck الآن هو كائن من نوع Deck، وليس مصفوفة. هو يحتوي على مصفوفة، لكنه ليس مصفوفة. لذا علينا كتابة deck.cards.length لاستخراج المصفوفة من كائن Deck والحصول على طولها.
وللسبب نفسه، علينا استخدام deck.cards[i] للولوج إلى عنصر من المصفوفة، بدلاً من deck[i] فقط.
التغيير الأخير هو أن استدعاء printCard يجب أن يبين صراحة أن printCard معرفة في الصنف Card.