الدرس 9 من 10
الوراثة وتعدّد الأشكال
- 15 دقيقة
- 6 فحوص
- 3 تلميحات
- إلى المطلوب
هدف الدرس
الكلمتان abstract وsuper والوسم @Override
الشرح
يرث الصنف الابن صنفًا آخر بكلمة extends، فيأخذ حقوله ودواله ثم يضيف إليها أو يغيّر بعضها. وتعني class Skeleton extends Enemy أن الهيكل العظمي عدوّ، فكل كود يقبل Enemy يقبله أيضًا. ويبدأ مُنشئ الابن باستدعاء مُنشئ الأب هكذا: super("Skeleton", 16);.
أما الصنف المجرّد (abstract) فلا تُنشأ منه كائنات مباشرة، وفيه دوال بلا جسم مثل public abstract int attack();، فيجب على كل صنف ابن أن يعرّفها، وإلا رفض المترجم الكود. وقريب منه الواجهة (interface)، وهي قائمة دوال يتعهّد الصنف بتعريفها، وليس فيها حقول للكائن، ويطبّقها الصنف بكلمة implements. والصنف يرث من أب واحد فقط، لكنه يستطيع أن يطبّق أي عدد من الواجهات.
وحين يعرّف الابن دالة بالتوقيع نفسه الذي لدالة في الأب فإنه يعيد تعريفها (override)، ويكتب قبلها @Override، ويستطيع أن يبني على نسخة الأب بدل أن يكرّرها، مثل super.takeHit(damage / 2). ومن هنا يأتي تعدّد الأشكال (polymorphism)، ففي 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 تضرب الموجة كلها وتعدّ الأحياء
- طُبع سطر لكل عدوّ ثم ضرر الموجة