المشترك مقابل الفريد
جزء من قسم البرمجة كائنية التوجه في رحلة 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
endlocal 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 في البُناة تكون فريدة لكل مثيل، بينما الحقول المعرّفة مباشرةً على جداول الصنف تكون مشتركة بين جميع مثيلات ذلك الصنف وأبنائه.
التحدي
سهللنستكشف كيف تتدفق البيانات عبر تسلسل هرمي للوراثة، وذلك بإنشاء نظام من الصنفين Creature وDragon. سترى بنفسك السمات المشتركة بين جميع الكائنات، والسمات الفريدة لكل كائن على حدة.
ستنظم شيفرتك في ثلاثة ملفات:
Creature.lua: عرّف الصنف الأب بسمة مشتركة على مستوى الصنفworld = "Fantasy Realm"تتشاركها جميع المخلوقات. أضف مُنشئًا:new(name)يخزّن اسم المخلوق كسمة للكائن.Dragon.lua: عرّف الصنف الابن الذي يرث من Creature. أضف سمة مشتركة على مستوى الصنفelement = "fire"تتشاركها جميع التنانين. ينبغي أن يستدعي المُنشئ:new(name, color)مُنشئ الصنف الأب للاسم، ثم يضيفcolorكسمة فريدة للكائن لكل تنين.main.lua: أنشئ تنينين مختلفين وافحص سماتهما لتوضيح الفرق بين البيانات المشتركة والفريدة.
ستتلقى مدخلين:
- اسم التنين الأول ولونه، يفصل بينهما فاصلة (مثلًا:
Smaug,red) - اسم التنين الثاني ولونه، يفصل بينهما فاصلة (مثلًا:
Draco,gold)
في ملفك الرئيسي، أنشئ التنينين باسميهما ولونيهما. ثم اطبع المعلومات التالية بهذا الترتيب تمامًا:
nameالتنين الأولcolorالتنين الأولnameالتنين الثانيcolorالتنين الثانيelementالتنين الأول (مشتركة من الصنف Dragon)elementالتنين الثاني (مشتركة من الصنف Dragon)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)
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس البرمجة كائنية التوجه
4مشروع: بنك رقمي
إعداد المشروعطريقة الإيداع7تعدد الأشكال وإعادة التعريف
إعادة تعريف الدوالاستدعاء دوال الفئة الأبDuck Typingواجهة مشتركةالتحقق من النوعمراجعة - أدوار الموظفين2نمط النموذج الأولي للفئات
مفهوم النموذج الأوليالربط باستخدام __indexالمنشئ :new()تهيئة الخصائصنسخ مستقلةملخص - مصنع السيارات5تحميل المعاملات في OOP
جمع الكائناتطرح الكائناتدمج الكائناتمقارنة الكائنات (<, >)مراجعة - رياضيات المحفظة8التغليف
اصطلاحات التسميةاستخدام Closures للخصوصيةالوصول عبر Closuresجداول للقراءة فقطمنطق التحقق من الصحةمراجعة - الخزنة الآمنة11أنماط التصميم (مبسط)
دوال المصنعجدول Singletonنمط الـ Iteratorالمراقب (المستمع)مراجعة - مصنع الـ Logger3حالة الكائن وسلوكه
متغيرات النسخةدالات الجلب (Getter Methods)دالات التعيين (Setter Methods)الخصائص المحسوبةتنسيق النصوصالتحقق من المساواةمراجعة - درجة الطالب6أساسيات الوراثة
إعداد الوراثةوراثة الـ Methodsتوسيع الـ Constructorإضافة Methods للابنالمشترك مقابل الفريدملخص - التسلسل الهرمي للأشكالتدرّب بنفسك: مترجم Lua عبر الإنترنت