Menu
CoddyTech

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

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

عند العمل مع الوراثة، من المهم فهم مكان وجود كل جزء من البيانات. بعض السمات مشتركة: تُعرَّف في الصنف الأب وتكون متاحة لجميع الأصناف الأبناء. أما السمات الأخرى فهي فريدة: تُنشأ خصيصًا في الصنف الابن أو في الكائن.

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

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"  -- مشترك بين جميع كائنات Dog

function Dog:new(name, breed)
    local obj = Animal.new(Animal, name)
    obj.breed = breed  -- فريد: لكل كائن Dog سلالته الخاصة
    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 في البُناة تكون فريدة لكل مثيل، بينما الحقول المعرّفة مباشرةً على جداول الصنف تكون مشتركة بين جميع مثيلات ذلك الصنف وأبنائه.

challenge icon

التحدي

سهل

لنستكشف كيف تتدفق البيانات عبر تسلسل هرمي للوراثة، وذلك بإنشاء نظام من الصنفين Creature وDragon. سترى بنفسك السمات المشتركة بين جميع الكائنات، والسمات الفريدة لكل كائن على حدة.

ستنظم شيفرتك في ثلاثة ملفات:

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

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

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

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

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

مثلًا، إذا كان المدخلان Smaug,red وDraco,gold، فينبغي أن يكون الناتج:

Smaug
red
Draco
gold
fire
fire
Fantasy Realm

لاحظ أن name وcolor يختلفان بين التنينين (سمتا كائن فريدتان)، بينما element وworld متماثلتان لكليهما (سمتا صنف مشتركتان يُعثر عليهما عبر سلسلة البحث).

جرّب بنفسك

-- main.lua: أنشئ تنانين ووضّح السمات المشتركة والفريدة

local Dragon = require('Dragon')

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

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

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

-- TODO: أنشئ التنين الأول باسمه ولونه

-- TODO: أنشئ التنين الثاني باسمه ولونه

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

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

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

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