الدرس 9 من 10

الوراثة والواجهات

هدف الدرس

الكلمات abstract وoverride وinterface

01

الشرح

تبني الوراثة صنفًا على صنف آخر، فالصنف class Goblin : Enemy يرث كل ما في Enemy من خصائص ودوال، ويمرّر مُنشئه البيانات إلى مُنشئ الصنف الأب بـ : base("عفريت", 30). أما abstract class Enemy فصنف مجرّد يمثّل فكرة عامّة ولا يُنشأ منه كائن مباشرة، فكتابة new Enemy(...) خطأ ترجمة، لأن اللعبة ليس فيها «عدوّ» بلا نوع، بل فيها عفريت أو فارس.

والدالة abstract ليس لها جسم، وكل صنف ابن ملزم بأن يكتبها بـ override. أما الدالة virtual فلها جسم جاهز، ويجوز للصنف الابن أن يستبدله بـ override، ويمكنه أن يستدعي نسخة الأب بـ base.TakeDamage(...). وهنا يظهر تعدّد الأشكال (polymorphism)، ففي List<Enemy> عفاريت وفرسان معًا، وe.Attack() تستدعي نسخة كل واحد منهم أثناء التشغيل. وانتبه إلى أن كتابة دالة بالاسم نفسه دون override تخفي دالة الأب ولا تستبدلها، فإذا كان المرجع من نوع Enemy وصل إلى نسخة الأب، ولا يعطيك المترجم إلا تحذيرًا.

أما الواجهة (interface) فتحدّد الدوال المطلوبة دون أن تكتب تنفيذها، مثل interface IDamageable { void TakeDamage(int amount); }، وكل صنف يكتب : IDamageable ملزم بأن ينفّذ دوالها ويجعلها public، حتى لو لم يكن بينه وبين غيره أب مشترك. وبهذه الطريقة تستطيع رصاصة في Unity أن تضرب كل ما تصيبه، عدوًّا كان أو برميلًا، دون أن تعرف نوعه. والصنف يرث من أب واحد فقط، لكنه يستطيع أن ينفّذ أي عدد من الواجهات.

02

المطلوب

اجعل Enemy صنفًا abstract، واجعل Attack() فيه دالة abstract، وTakeDamage دالة virtual. ثم اكتب Attack() بـ override في Goblin لتُرجع 5، وفي Knight لتُرجع 12، واجعل الفارس المدرّع يتلقّى نصف الضرر فقط بكتابة override لـ TakeDamage. واجعل Barrel ينفّذ IDamageable بحيث تكسره أي ضربة فتصير قيمة Broken هي true، ثم أكمل TotalAttack(enemies) لتجمع هجمات الأعداء الأحياء فقط.

الفحوص

5 فحوص
  1. الصنف Enemy مجرّد (abstract)، وكذلك الدالة Attack فيه
  2. كل عدوّ يهاجم بقوّته عبر مرجع Enemy، العفريت 5 والفارس 12
  3. الفارس يتلقّى نصف الضرر عبر مرجع Enemy، والعفريت يتلقّاه كاملًا
  4. الصنف Barrel ينفّذ الواجهة IDamageable وتكسره أي ضربة
  5. الدالة TotalAttack تجمع هجمات الأحياء فقط
03

تلميحات

0/3
دروس المسارأتممت 0 من 10

تُكتب بلغة C# ألعاب Unity وتطبيقات .NET، ولكل متغيّر فيها نوع ثابت، وتُبنى برامجها من أصناف، وتأتي معها أدوات جاهزة لأغلب ما تحتاجه.

مستواه مبتدئ، وفيه 10 دروس مجموع مدّتها ساعتان ونصف.

Program.cs
المخرجاتC# (Mono 6.6, Judge0)

يُترجَم كودك الآن ويُشغَّل على الخادم.

–/5

يُترجَم كودك الآن ويُشغَّل على الخادم.

تجد 5 فحوص في بطاقة «المطلوب».

دروس المسارأتممت 0 من 10

تُكتب بلغة C# ألعاب Unity وتطبيقات .NET، ولكل متغيّر فيها نوع ثابت، وتُبنى برامجها من أصناف، وتأتي معها أدوات جاهزة لأغلب ما تحتاجه.

مستواه مبتدئ، وفيه 10 دروس مجموع مدّتها ساعتان ونصف.