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