الدرس 8 من 10
الوراثة بالجداول
- 14 دقيقة
- 6 فحوص
- 3 تلميحات
- إلى المطلوب
هدف الدرس
ابنِ على الأب وأعد تعريف دالته
الشرح
الوراثة في Lua سلسلة من البحث، فالسطر setmetatable(Warrior, { __index = Player }) معناه أن ما لا يوجد في Warrior يُبحث عنه في Player. فتبحث Lua في كائن المحارب نفسه أولًا، ثم في Warrior، ثم في Player، وبهذا يرث المحارب isAlive دون أن تكتبها له.
ولإعادة تعريف دالة (override) تكتب في الصنف الابن دالة بالاسم نفسه، فتجدها Lua قبل دالة الأب. وإن أردت أن تُكمل بعمل الأب فاستدعِ دالته صراحة بنقطة واحدة ومرّر معها self، هكذا: Player.takeDamage(self, amount). أمّا self:takeDamage(amount) فتستدعي دالة الابن نفسها مرّة بعد مرّة بلا نهاية حتى يظهر الخطأ stack overflow.
وانتبه في المُنشئ (constructor)، فـ Player.new تُرجع كائنًا جدوله الوصفي Player، وإن لم تغيّره إلى Warrior بقي الكائن لاعبًا عاديًّا، فتكون دوال المحارب مكتوبة لكن البحث لا يصل إليها، ولا يظهر لك أي خطأ.
المطلوب
أصلح Warrior.new(name, hp, armor) لتبني على Player.new ويصبح الكائن الذي تُرجعه من Warrior، ثم اكتب Warrior:takeDamage(amount) التي تطرح armor من الضربة دون أن تنزل بها تحت الصفر، ثم تُكمل بالدالة takeDamage في الأب.
الفحوص
6 فحوص- الدالة Warrior.new تبني على Player.new
- المحارب يرث دوال الأب
- الدرع يُنقص قوّة الضربة
- الضربة الأضعف من الدرع لا تؤذي ولا تشفي
- اللاعب العادي ليس له درع
- دوال Warrior للمحاربين وحدهم