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

تهيئة الخصائص

جزء من قسم 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) الخاص به. هذه هي قوة الجمع بين النماذج الأولية والمنشئات ذات المعلمات — سلوك مشترك مع حالة فردية.

challenge icon

التحدي

سهل

لنقم ببناء فئة 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

ستتلقى مدخلين:

  1. اسم الشخص
  2. عمر الشخص

على سبيل المثال، إذا كانت المدخلات هي 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() على نسخة الشخص الخاصة بك
quiz iconاختبر نفسك

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

جميع دروس Object Oriented Programming