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

Mixins بسيطة

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

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

قد يحتاج كلٌّ من Player وMenuItem إلى method باسم :describe()، لكنهما لا يشتركان في parent class. وهنا يأتي دور mixins.

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

local Printable = {}

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

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

لتطبيق mixin على class، تنسخ كل function من جدول mixin إلى جدول class:

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()

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

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

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

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

challenge icon

التحدي

سهل

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

ستنظّم code الخاص بك عبر ثلاثة ملفات:

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

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

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

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

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

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

Title: Lua Basics
Tags: programming, tutorial

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

جرّب بنفسك

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

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

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

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

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

-- TODO: اطبع العنوان بالصيغة: Title: {title}

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

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

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

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