مجموعات الورق الفرعية

كيف يفترض بنا تمثيل يد أو مجموعة فرعية أخرى من مجموعة الورق الكاملة؟ أحد الاحتمالات هو إنشاء صنف جديد باسم Hand، والذي قد يوسع Deck (في Java يقال عن الصنف أنه يوسع –extends- صنفاً آخر إذا كان يرثه). يوجد احتمال آخر، وهو الذي سأشرحه، يكون باستخدام كائن Deck عدد أوراقه أقل من 52.
قد نرغب بعملية، subdeck، تأخذ Deck مع مجال من الأدلة، وتعيد مجموعة ورق جديدة تحتوي على المجموعة الفرعية المحددة من الأوراق:
كود:
public static Deck subdeck(Deck deck, int low, int high) {
   Deck sub = new Deck(high-low+1);
 
   for (int i = 0; i<sub.cards.length; i++) {
      sub.cards[i] = deck.cards[low+i];
   }
   return sub;
}
إن طول المجموعة الفرعية يساوي high-low+1 وذلك بسبب تضمين الورقتين الموجودتين عند الدليلين high وlow. هذا النوع من الحسابات قد يكون مضللاً، ويؤدي إلى خطأ "بفارق واحد". رسم شكل هو أفضل وسيلة في العادة لتفاديهم.
لأننا نعطي new متحولاً، فسيتم استدعاء الباني الأول، الذي يحجز المصفوفة فقط ولا يحجز أية أوراق. بداخل حلقة for، يتم تعبئة المجموعة الفرعية بنسخ عن مرجعيات مجموعة الورق.
فيما يلي مخطط الحالة لمجموعة فرعية تم إنشاؤها باستخدام المعاملات low=3 وhigh=7. النتيجة هي يد فيها 5 أوراق يتم مشاركتها مع المجموعة الأصلية؛ أي تم استخدام أسماء مستعارة.
http://file.topmaxtech.net/images/ph...3962712211.jpg
التسمية المستعارة ليست فكرة جيدة عادة، لأن التغييرات في إحدى المجموعات الفرعية تؤثر على البقية، وهو ما يخالف السلوك المتوقع من أوراق الشدة ومجموعات ورق اللعب الحقيقة. لكن إذا كانت الأوراق غير قابلة للتعديل، ستكون التسمية المستعارة أقل خطورة. في هذه الحالة، لن يوجد أي سبب على الأغلب يدعونا لتغيير رتبة أو منظومة ورقة ما. بدلاً من ذلك يمكننا إنشاء كل ورقة مرة واحدة ثم معاملتها على أنها كائن غير قابل للتحوير. حتى الآن تبدو التسمية المستعارة مع كائنات Card خياراً معقولاً.