Menu
Coddy logo textTech
flag Ar iconالعربيةdown icon

تطبيق Mixins متعددة

جزء من قسم البرمجة كائنية التوجه في رحلة Lua على Coddy. الدرس 52 من 70.

يضيف mixin واحد مجموعةً واحدةً من السلوكيات إلى class. لكن الكائنات الحقيقية غالبًا ما تحتاج إلى إمكانات من مصادر متعددة. قد يحتاج كائن اللعبة إلى التحرك و الظهور على الشاشة: وهما جانبان منفصلان لا ينتميان إلى mixin نفسه.

الحل مباشر: استخدم apply لعدة mixins على نفس class. يساهم كل mixin بـ methods الخاصة به، وينتهي الأمر بـ class التي تحتوي عليها جميعًا:

local Movable = {}
function Movable:move(dx, dy)
    self.x = self.x + dx
    self.y = self.y + dy
end

local Visible = {}
function Visible:show()
    print("Showing at " .. self.x .. ", " .. self.y)
end
function Visible:hide()
    print("Hidden")
end

طبّق كلا من mixin على صفّك باستخدام دالة المساعدة نفسها من قبل:

local function applyMixin(class, mixin)
    for key, value in pairs(mixin) do
        class[key] = value
    end
end

local GameObject = {}
GameObject.__index = GameObject

applyMixin(GameObject, Movable)
applyMixin(GameObject, Visible)

الآن يمكن لنسخ GameObject أن تتحرك وتعرض نفسها أيضًا:

local obj = setmetatable({x = 0, y = 0}, GameObject)
obj:move(5, 3)
obj:show()  -- عرض عند 5، 3

تنبيه واحد: إذا كان لدى اثنين من mixin تعريف لـ method بالاسم نفسه، فسيكتب الثاني الذي تم تطبيقه فوق الأول. احرص على أن تكون methods الخاصة بـ mixin متميزة لتجنب السلوك غير المتوقع.

challenge icon

التحدي

سهل

لنبنِ class باسم Character للعبة تجمع بين إمكانات متعددة باستخدام mixins! سيتمكن character من مهاجمة الأعداء ومعالجة نفسه: سلوكان متميزان يأتيان من mixins منفصلين.

ستنظم كودك عبر أربعة ملفات:

  • Attacker.lua: أنشئ mixin يحتوي على method باسم :attack(targetName) يطبع {self.name} attacks {targetName} for {self.damage} damage! (يفترض أن الكائن has حقلي name وdamage)
  • Healer.lua: أنشئ mixin يحتوي على method باسم :heal(amount) يضيف amount إلى self.health ويطبع {self.name} heals for {amount}. Health: {newHealth}
  • Character.lua: أنشئ class باسم Character مع constructor هو :new(name, health, damage) يخزن السمات الثلاث كلها. طبّق كلاً من mixinَي Attacker وHealer حتى يتمكن كل character من الهجوم والمعالجة. أدرج method باسم :status() يطبع {name} - Health: {health}, Damage: {damage}
  • main.lua: اكتب helper function المسماة applyMixin هنا. اقرأ inputs لاسم character وhealth وdamage وهدف للهجوم وamount للمعالجة. أنشئ Character، واعرض حالته، واجعله يهاجم الهدف، ثم يعالج نفسه، وبعد ذلك اعرض حالته مرة أخرى.

ستتلقى خمسة inputs:

  1. اسم Character (سلسلة نصية)
  2. health الابتدائي (رقم)
  3. قيمة damage (رقم)
  4. اسم الهدف المراد مهاجمته (سلسلة نصية)
  5. amount المراد معالجته (رقم)

يجب أن يُظهر إخراجك character وهو يستخدم قدرات كلا mixinين:

{name} - Health: {health}, Damage: {damage}
{name} attacks {target} for {damage} damage!
{name} heals for {healAmount}. Health: {newHealth}
{name} - Health: {newHealth}, Damage: {damage}

على سبيل المثال، إذا كانت inputs هي Warrior و100 و25 وGoblin و30، فيجب أن يكون الإخراج:

Warrior - Health: 100, Damage: 25
Warrior attacks Goblin for 25 damage!
Warrior heals for 30. Health: 130
Warrior - Health: 130, Damage: 25

يساهم كل mixin بـ method خاص به في class Character. لا يرث character من أيٍّ من mixinين. بل يكتسب قدراتهما ببساطة من خلال function applyMixin. هذه هي قوة الجمع بين mixins متعددة!

جرّب بنفسك

-- الملف الرئيسي

-- TODO: اكتب دالة المساعدة applyMixin
-- يجب أن تنسخ هذه الدالة جميع الـ methods من جدول mixin إلى جدول target
local function applyMixin(target, mixin)
    -- TODO: نفّذ تطبيق الـ mixin
end

-- اجعل applyMixin متاحًا عالميًا حتى يتمكن Character.lua من استخدامه
_G.applyMixin = applyMixin

local Character = require('Character')

-- اقرأ المدخلات
local name = io.read()
local health = tonumber(io.read())
local damage = tonumber(io.read())
local targetName = io.read()
local healAmount = tonumber(io.read())

-- TODO: أنشئ Character بالاسم وhealth وdamage المعطاة

-- TODO: اعرض حالة الشخصية

-- TODO: اجعل الشخصية تهاجم الهدف

-- TODO: اجعل الشخصية تشفي نفسها

-- TODO: اعرض حالة الشخصية مرة أخرى
quiz iconاختبر نفسك

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

جميع دروس البرمجة كائنية التوجه

تدرّب بنفسك: مترجم Lua عبر الإنترنت