الدرس 9 من 10
الوراثة والتعدّد الشكلي
- 15 دقيقة
- 6 معايير للتصحيح
- 3 تلميحات
- إلى المطلوب
هدف الدرس
abstract و @Override و super
الشرح
الصنف الفرعي يرث صنفًا آخر بـ extends: يأخذ حقوله ودواله، ثم يضيف إليها أو يغيّر بعضها. وclass Skeleton extends Enemy تعني أن الهيكل العظمي عدوّ، فكل كود يقبل Enemy يقبله. ومُنشئ الابن يبدأ باستدعاء مُنشئ الأب: super("Skeleton", 16);.
والصنف المجرّد (abstract) لا تُنشأ منه كائنات مباشرة، ويعلن دوال بلا جسم مثل public abstract int attack();، فيُلزم كل صنف فرعي بتعريفها وإلا رفض المترجم الكود. وقريب منه الواجهة (interface): قائمة دوال يَعِد الصنف بتعريفها، بلا حقول للكائن، ويطبّقها بـ implements. والصنف لا يرث إلا أبًا واحدًا، لكنه يطبّق ما شاء من الواجهات.
وحين يعرّف الابن دالة بتوقيع دالة في الأب فإنه يتجاوزها، ويُعلن ذلك بـ @Override. ويستطيع أن يبني على نسخة الأب بدل نسخها: super.takeHit(damage / 2). ومن هنا التعدّد الشكلي: في for (Enemy e : wave) يستدعي e.attack() نسخة الصنف الحقيقي لكل كائن، لا نسخة Enemy.
المطلوب
أكمل Skeleton: اسمه Skeleton وصحّته 16 وهجومه 5. وGolem: اسمه Golem وصحّته 100 وهجومه 12، ويتجاوز takeHit فيتلقّى نصف الضرر فقط. ثم totalAttack(wave) تُرجع مجموع هجوم الموجة، وsurvivors(wave, damage) تضرب كل عدوّ بـ damage وتُرجع عدد من بقي حيًّا. واطبع من main سطرًا لكل عدوّ بالشكل Zombie: 3، ثم ضرر الموجة: 20.
معايير التصحيح
6 معايير- Skeleton: الاسم والصحة 16 والهجوم 5
- Golem: الاسم والصحة 100 والهجوم 12
- Golem يتلقّى نصف الضربة، وغيره الضربة كاملة
- totalAttack تجمع هجوم كل عدوّ بطريقته
- survivors تضرب الموجة كلها وتعدّ الأحياء
- طُبع سطر لكل عدوّ ثم ضرر الموجة