المنشئ :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() هو المكان الوحيد الذي يتم فيه إنشاء الكائنات، مما يجعل الكود الخاص بك منظماً وقابلاً للتوقع.
التحدي
سهللنقم ببناء فئة 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() لعدد المرات المحدد
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس Object Oriented Programming
4مشروع: بنك رقمي
إعداد المشروعطريقة الإيداع7تعدد الأشكال وإعادة التعريف
إعادة تعريف الدوالاستدعاء دوال الفئة الأبDuck Typingواجهة مشتركةالتحقق من النوعمراجعة - أدوار الموظفين2نمط النموذج الأولي للفئات
مفهوم النموذج الأوليالربط باستخدام __indexالمنشئ :new()تهيئة الخصائصنسخ مستقلةملخص - مصنع السيارات5تحميل المعاملات في OOP
جمع الكائناتطرح الكائناتدمج الكائناتمقارنة الكائنات (<, >)مراجعة - رياضيات المحفظة8التغليف
اصطلاحات التسميةاستخدام Closures للخصوصيةالوصول عبر Closuresجداول للقراءة فقطمنطق التحقق من الصحةمراجعة - الخزنة الآمنة11أنماط التصميم (مبسط)
دوال المصنعجدول Singletonنمط الـ Iteratorالمراقب (المستمع)مراجعة - مصنع الـ Logger3حالة الكائن وسلوكه
متغيرات النسخةدالات الجلب (Getter Methods)دالات التعيين (Setter Methods)الخصائص المحسوبةتنسيق النصوصالتحقق من المساواةمراجعة - درجة الطالب6أساسيات الوراثة
إعداد الوراثةوراثة الـ Methodsتوسيع الـ Constructorإضافة Methods للابنالمشترك مقابل الفريدملخص - التسلسل الهرمي للأشكال