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

المنشئ :new()

جزء من قسم Object Oriented Programming في رحلة Lua على Coddy — الدرس 8 من 70.

إن إنشاء الكائنات يدويًا—إنشاء جدول فارغ، وتعيين جدوله الوصفي (metatable)، وربط __index—يصبح أمرًا متكررًا. الحل القياسي هو تعريف دالة بناء (constructor method) باسم :new() مباشرة داخل الفئة (class) التي تتولى كل هذا نيابة عنك.

إليك النمط:

local Dog = {}
Dog.__index = Dog

function Dog:new()
    local instance = {}
    setmetatable(instance, self)
    return instance
end

function Dog:bark()
    print("Woof!")
end

دعونا نحلل ما يحدث داخل :new(). أولاً، نقوم بإنشاء جدول فارغ يسمى instance. ثم نقوم بتعيين الـ metatable الخاص به إلى self—والذي هو Dog عندما نستدعي Dog:new().

بما أن Dog.__index يشير إلى Dog نفسه، يمكن للمثيل العثور على جميع الدوال (methods) المعرفة في Dog. أخيرًا، نقوم بإرجاع الكائن الجديد.

لاحظ السطر Dog.__index = Dog خارج المنشئ (constructor). هذا اختصار شائع؛ فبدلاً من إنشاء metatable منفصل، يعمل جدول الفئة (class table) كنموذج أولي (prototype) وmetatable في آن واحد.

الآن أصبح إنشاء الكائنات نظيفاً ومتسقاً:

local myDog = Dog:new()
myDog:bark()  -- المخرجات: Woof!

كل فئة (class) تقوم بإنشائها ستتبع هذا الهيكل نفسه. يصبح المنشئ :new() هو المكان الوحيد الذي يتم فيه إنشاء الكائنات، مما يجعل الكود الخاص بك منظماً وقابلاً للتوقع.

challenge icon

التحدي

سهل

لنقم ببناء فئة Cat باستخدام نمط المنشئ (constructor) القياسي الذي تعلمته للتو. ستقوم بتنظيم الكود الخاص بك عبر ملفين لممارسة بنية الوحدة (module) الصحيحة.

سوف تقوم بإنشاء:

  • Cat.lua: قم بتعريف فئة Cat الخاصة بك مع نمط المنشئ الكامل. يجب أن تتضمن فئتك ما يلي:
    • جدول الفئة مع __index يشير إلى نفسه
    • منشئ :new() يقوم بإنشاء مثيل (instance)، وضبط الجدول الميتا (metatable) الخاص به، وإرجاعه
    • طريقة :meow() تقوم بطباعة صوت القطة
    قم بإرجاع جدول الفئة في نهاية الملف.
  • main.lua: استدعِ وحدة Cat الخاصة بك واستخدم المنشئ لإنشاء مثيل للقطة. ثم قم باستدعاء طريقتها للتحقق من أن كل شيء مرتبط بشكل صحيح.

ستتلقى مدخلاً واحداً: عدد المرات التي يجب أن تموء فيها قطتك.

يجب أن تقوم طريقة :meow() بطباعة ما يلي بالضبط:

Meow!

في ملفك الرئيسي، قم بإنشاء قطة باستخدام Cat:new() واستدعِ :meow() لعدد المرات المحدد.

على سبيل المثال، إذا كان الإدخال هو 3، يجب أن يكون المخرج:

Meow!
Meow!
Meow!

ورقة مرجعية

لإنشاء فئة (class) مع منشئ (constructor) في Lua، قم بتعريف طريقة :new() التي تنشئ مثيلات (instances):

local ClassName = {}
ClassName.__index = ClassName

function ClassName:new()
    local instance = {}
    setmetatable(instance, self)
    return instance
end

function ClassName:method()
    -- تنفيذ الطريقة
end

يشير الحقل __index إلى الفئة نفسها، مما يسمح للمثيلات بالوصول إلى الطرق المعرفة في جدول الفئة.

داخل :new():

  • أنشئ جدولاً فارغاً للمثيل
  • قم بتعيين جدول الميتا (metatable) الخاص به إلى self (الفئة)
  • أرجع المثيل الجديد

أنشئ كائنات باستخدام المنشئ:

local obj = ClassName:new()
obj:method()

جرّب بنفسك

-- استدعاء وحدة Cat
local Cat = require('Cat')

-- قراءة المدخلات: عدد مرات المواء
local times = tonumber(io.read())

-- TODO: إنشاء كائن قطة باستخدام Cat:new()

-- TODO: استدعاء الدالة :meow() لعدد المرات المحدد
quiz iconاختبر نفسك

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

جميع دروس Object Oriented Programming