تهيئة الخصائص
جزء من قسم Object Oriented Programming في رحلة Lua على Coddy — الدرس 9 من 70.
إنّ المُنشئ :new() الذي تعلمته يقوم بإنشاء كائنات، ولكن كل نسخة تبدأ بشكل متطابق. تحتاج الكائنات الحقيقية إلى بيانات فريدة—فالشخص لديه اسم محدد، واللاعب لديه نتيجة بداية. ولجعل الكائنات مفيدة، يجب أن يقبل المُنشئ وسائط (arguments) ويقوم بتعيينها للنسخة الجديدة.
إليك كيفية توسيع المنشئ (constructor) لقبول قيم أولية:
local Dog = {}
Dog.__index = Dog
function Dog:new(name, breed)
local instance = {}
setmetatable(instance, self)
instance.name = name
instance.breed = breed
return instance
end
function Dog:introduce()
print("I am " .. self.name .. ", a " .. self.breed)
endيأخذ المنشئ (constructor) الآن name و breed كبارامترات. بعد إنشاء المثيل الفارغ وضبط الـ metatable الخاص به، نقوم بتعيين هذه القيم مباشرة إلى حقول المثيل. سيكون لكل كائن يتم إنشاؤه name و breed خاصين به.
local dog1 = Dog:new("Rex", "German Shepherd")
local dog2 = Dog:new("Bella", "Poodle")
dog1:introduce() -- المخرجات: أنا Rex، من نوع German Shepherd
dog2:introduce() -- المخرجات: أنا Bella، من نوع Poodleيشترك كلا الكلبين في نفس الطريقة :introduce() من النموذج الأولي (prototype)، ولكن لكل منهما اسمه وسلالته الفريدة المخزنة في جدول المثيل (instance table) الخاص به. هذه هي قوة الجمع بين النماذج الأولية والمنشئات ذات المعلمات — سلوك مشترك مع حالة فردية.
التحدي
سهللنقم ببناء فئة Person التي تنشئ أفراداً فريدين بأسماء وأعمار خاصة بهم. ستقوم بتنظيم الكود الخاص بك عبر ملفين لممارسة هيكلة الوحدات (modules) بشكل صحيح.
ستقوم بإنشاء:
Person.lua: قم بتعريف فئةPersonالخاصة بك مع منشئ (constructor) يقبل الاسم والعمر. قم بتضمين تابع:introduce()يسمح لكل شخص بتقديم نفسه.main.lua: استدعِ وحدة Person وقم بإنشاء مثيل (instance) لشخص باستخدام المدخلات المقدمة. ثم اجعلهم يقدمون أنفسهم.
يجب أن يقبل المنشئ :new(name, age) كلا القيمتين ويخزنهما في المثيل الجديد. يجب أن يطبع التابع :introduce() بهذا التنسيق تماماً:
Hello, my name is [name] and I am [age] years oldستتلقى مدخلين:
- اسم الشخص
- عمر الشخص
على سبيل المثال، إذا كانت المدخلات هي Alice و 25، يجب أن تكون النتيجة:
Hello, my name is Alice and I am 25 years oldورقة مرجعية
لإنشاء كائنات ببيانات فريدة، قم بتوسيع منشئ :new() لقبول المعلمات وتعيينها للمثيل:
local Dog = {}
Dog.__index = Dog
function Dog:new(name, breed)
local instance = {}
setmetatable(instance, self)
instance.name = name
instance.breed = breed
return instance
end
function Dog:introduce()
print("I am " .. self.name .. ", a " .. self.breed)
endقم بإنشاء مثيلات بقيم مختلفة:
local dog1 = Dog:new("Rex", "German Shepherd")
local dog2 = Dog:new("Bella", "Poodle")
dog1:introduce() -- المخرجات: I am Rex, a German Shepherd
dog2:introduce() -- المخرجات: I am Bella, a Poodleيمتلك كل كائن بياناته الفريدة الخاصة المخزنة في جدول المثيل الخاص به، بينما يتشارك الطرق (methods) من النموذج الأولي (prototype).
جرّب بنفسك
-- استدعاء وحدة Person
local Person = require('Person')
-- قراءة المدخلات
local name = io.read()
local age = io.read()
-- TODO: أنشئ نسخة Person جديدة باستخدام Person:new(name, age)
-- TODO: استدعِ الدالة introduce() على نسخة الشخص الخاصة بك
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس 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 للابنالمشترك مقابل الفريدملخص - التسلسل الهرمي للأشكال