Menu
CoddyTech

Mixins بسيطة

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

يتيح لك التركيب وضع كائنات داخل كائنات أخرى. ولكن ماذا لو أردت مشاركة السلوك بين فئات غير مترابطة؟

قد يحتاج كلٌّ من Player وMenuItem إلى طريقة :describe()، لكنهما لا يشتركان في فئة أب. وهنا يأتي دور المزيجات.

المزيج هو ببساطة جدول يحتوي على دوال. أنت «تمزج» هذه الدوال في فئة بنسخها إليها:

local Printable = {}

function Printable:describe()
    print("Object: " .. tostring(self))
end

function Printable:log(message)
    print("[LOG] " .. message)
end

لتطبيق هذا المزيج على صنف، انسخ كل دالة من جدول المزيج إلى جدول الصنف:

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

local Player = {}
Player.__index = Player

applyMixin(Player, Printable)  -- الآن يمتلك Player الدالتين :describe() و :log()

بعد تطبيق المزيج، يمكن لأي مثيل من Player استدعاء تلك الأساليب كما لو كانت معرّفة مباشرةً في الصنف:

local p = setmetatable({}, Player)
p:log("Player created")  -- [LOG] تم إنشاء Player

على عكس الوراثة، لا تُنشئ المزائج علاقة بين أب وطفل. فأنت ببساطة تنسخ الدوال من جدول إلى آخر.

وهذا يجعل المزيجات مثالية لمشاركة السلوكيات المساعدة، مثل التسجيل أو التسلسل أو أساليب الوصف، بين الفئات التي لا يجمعها شيء آخر.

challenge icon

التحدي

سهل

لننشئ نظامًا للوسوم باستخدام المزيجات! ستنشئ مزيجًا باسم Taggable يمكن تطبيقه على أي صنف، ما يمنح الكائنات القدرة على إدارة مجموعة من الوسوم، وهو أمر مفيد لتصنيف العناصر أو المنشورات أو أي كيان يحتاج إلى تسميات.

ستنظّم شيفرتك في ثلاثة ملفات:

  • Taggable.lua: أنشئ جدول مزيج يحتوي على طريقتين:
    • :addTag(tag): تضيف وسمًا إلى self.tags (مع افتراض وجود الجدول)
    • :listTags(): تطبع جميع الوسوم بالتنسيق Tags: tag1, tag2, tag3 (أو Tags: none إذا كان فارغًا)
  • Article.lua: أنشئ صنفًا باسم Article مع مُنشئ :new(title) يخزّن العنوان ويهيّئ جدول tags فارغًا. أضف الطريقة :getTitle() التي تُعيد عنوان المقالة.
  • main.lua: اكتب الدالة المساعدة applyMixin هنا، ثم طبّق المزيج باستخدام applyMixin(Article, Taggable) لمنح مثيلات Article إمكانات إضافة الوسوم. بعد ذلك، اقرأ مدخلات عنوان المقالة ووسمين. أنشئ مقالة، وأضف إليها الوسمين، واطبع العنوان، ثم اعرض جميع الوسوم.

ستتلقى ثلاثة مدخلات:

  1. عنوان المقالة (نص)
  2. الوسم الأول المراد إضافته (نص)
  3. الوسم الثاني المراد إضافته (نص)

ينبغي أن يعرض ناتجك عنوان المقالة متبوعًا بوسومها:

Title: {title}
Tags: {tag1}, {tag2}

على سبيل المثال، إذا كانت المدخلات هي Lua Basics وprogramming وtutorial، فينبغي أن يكون الناتج:

Title: Lua Basics
Tags: programming, tutorial

تذكّر: تعمل طرق المزيج لأن مثيلات Article تحتوي على جدول tags يمكن لطرق المزيج التعامل معه. لا ينشئ المزيج هذا الجدول؛ بل ينشئه مُنشئ Article. يوفّر المزيج السلوك المشترك فحسب!

جرّب بنفسك

-- الملف الرئيسي لنظام الوسوم
local Taggable = require('Taggable')
local Article = require('Article')

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

-- TODO: طبّق المكوّن Taggable على Article باستخدام applyMixin

-- اقرأ المدخلات
local title = io.read()
local tag1 = io.read()
local tag2 = io.read()

-- TODO: أنشئ كائن Article بالعنوان المُعطى

-- TODO: أضف كلا الوسمين إلى المقالة

-- TODO: اطبع العنوان بالتنسيق: Title: {title}

-- TODO: اعرض جميع الوسوم باستخدام التابع listTags
quiz iconاختبر نفسك

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

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

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