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

المشترك مقابل الفريد

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

عند العمل مع الوراثة، من المهم فهم مكان وجود كل جزء من البيانات. بعض attributes تكون مشتركة: تكون defined في الصنف الأب ويمكن الوصول إليها من قِبل all الأبناء. بينما تكون أخرى فريدة: تُنشأ خصيصًا في child class أو instance.

تأمّل هذا التسلسل الهرمي:

local Animal = {}
Animal.__index = Animal
Animal.kingdom = "Animalia"  -- مشترك: معرّف على الصنف

function Animal:new(name)
    local obj = {name = name}  -- فريد: مخزّن على كل مثيل
    setmetatable(obj, Animal)
    return obj
end
local Dog = {}
Dog.__index = Dog
setmetatable(Dog, {__index = Animal})
Dog.sound = "bark"  -- مشترك بين جميع Dogs

function Dog:new(name, breed)
    local obj = Animal.new(Animal, name)
    obj.breed = breed  -- فريد: كل Dog له breed خاص به
    setmetatable(obj, Dog)
    return obj
end

عند إنشاء مثيل من Dog، توجد بعض القيم مباشرةً على الكائن، بينما يتم العثور على قيم أخرى عبر سلسلة البحث:

local rex = Dog:new("Rex", "German Shepherd")

-- فريد لهذا المثيل (مخزن على rex)
print(rex.name)    -- "Rex"
print(rex.breed)   -- "German Shepherd"
-- مشترك (تم العثور عليه عبر البحث)
print(rex.sound)   -- "bark" (من Dog)
print(rex.kingdom) -- "Animalia" (من Animal)

التمييز الأساسي: الحقول المُسندة إلى obj في المُنشئات تكون فريدة لكل مثيل، بينما الحقول المُعرَّفة مباشرةً في جداول class تكون مشتركة بين جميع مثيلات ذلك class وأبنائه.

challenge icon

التحدي

سهل

لنستكشف كيفية تدفق البيانات عبر تسلسل هرمي للوراثة من خلال بناء نظام Creature وDragon من الفئات. سترى بنفسك أيّ attributes تتم مشاركتها عبر جميع instances وأيّها تكون فريدة لكل object فردي.

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

  • Creature.lua: عرّف الفئة الأصلية لديك مع attribute على مستوى الفئة مشترك world = "Fantasy Realm" تتشاركه جميع creatures. أدرج constructor ‏:new(name) يخزّن اسم creature باعتباره attribute على مستوى instance.
  • Dragon.lua: عرّف الفئة الابنة التي ترث من Creature. أضف attribute على مستوى الفئة مشتركًا element = "fire" تتشاركه جميع dragons. يجب أن يستدعي constructor ‏:new(name, color) لديك constructor الفئة الأصلية للاسم، ثم يضيف color باعتباره attribute فريدًا على مستوى instance لكل dragon.
  • main.lua: أنشئ dragon مختلفين وافحص attributes الخاصة بهما لتوضيح الفرق بين البيانات المشتركة والفريدة.

ستتلقى inputين:

  1. اسم dragon الأول ولونه، مفصولين بفاصلة (مثلًا: Smaug,red)
  2. اسم dragon الثاني ولونه، مفصولين بفاصلة (مثلًا: Draco,gold)

في ملفك الرئيسي، أنشئ كلا dragon بالاسمين واللونين الخاصين بهما. ثم اطبع المعلومات التالية بهذا الترتيب exact:

  1. name الخاص بـ dragon الأول
  2. color الخاص بـ dragon الأول
  3. name الخاص بـ dragon الثاني
  4. color الخاص بـ dragon الثاني
  5. element الخاص بـ dragon الأول (مشترك من Dragon class)
  6. element الخاص بـ dragon الثاني (مشترك من Dragon class)
  7. world الخاص بـ dragon الأول (مشترك من Creature class)

على سبيل المثال، إذا كان inputان هما Smaug,red وDraco,gold، فيجب أن يكون output:

Smaug
red
Draco
gold
fire
fire
Fantasy Realm

لاحظ أن name وcolor يختلفان لكل dragon (attributes فريدة على مستوى instance)، بينما يكون element وworld متماثلين لكليهما (attributes مشتركة على مستوى class يتم العثور عليها عبر سلسلة البحث).

جرّب بنفسك

-- main.lua: إنشاء تنانين وإظهار السمات المشتركة مقابل الفريدة

local Dragon = require('Dragon')

-- اقرأ المدخل للتنين الأول (name,color)
local input1 = io.read()
-- اقرأ المدخل للتنين الثاني (name,color)
local input2 = io.read()

-- TODO: حلّل المدخل الأول لاستخراج name و color
-- Hint: استخدم string.match مع النمط "([^,]+),([^,]+)"

-- TODO: حلّل المدخل الثاني لاستخراج name و color

-- TODO: أنشئ التنين الأول بـ name و color الخاصين به

-- TODO: أنشئ التنين الثاني بـ name و color الخاصين به

-- TODO: اطبع ما يلي بالترتيب:
-- 1. اسم التنين الأول
-- 2. لون التنين الأول
-- 3. اسم التنين الثاني
-- 4. لون التنين الثاني
-- 5. عنصر التنين الأول (مشترك من فئة Dragon)
-- 6. عنصر التنين الثاني (مشترك من فئة Dragon)
-- 7. عالم التنين الأول (مشترك من فئة Creature)
quiz iconاختبر نفسك

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

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

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