طرح الكائنات
جزء من قسم Object Oriented Programming في رحلة Lua على Coddy — الدرس 27 من 70.
تماماً كما يتعامل __add مع العامل +، يحدد التابع __sub السلوك الخاص بالعامل -. النمط متطابق تماماً—حيث تقوم بتعريف دالة تستقبل معاملين وتُعيد كائناً جديداً.
local Color = {}
Color.__index = Color
function Color:new(r, g, b)
local obj = {r = r, g = g, b = b}
setmetatable(obj, Color)
return obj
end
function Color.__sub(c1, c2)
return Color:new(c1.r - c2.r, c1.g - c2.g, c1.b - c2.b)
endعند العمل مع ألوان RGB، يمكن أن تنتج عملية الطرح قيمًا سالبة. في التطبيقات الواقعية، قد ترغب في حصر النتائج ضمن نطاقات صالحة (0-255)، لكن هيكل الطريقة الوصفية (metamethod) الأساسي يظل كما هو.
local bright = Color:new(200, 150, 100)
local dim = Color:new(50, 30, 20)
local result = bright - dim
print(result.r, result.g, result.b) -- الناتج: 150 120 80تذكر: قم بتعريف __sub باستخدام نقطة (وليس نقطتين رأسيتين) لأنه metamethod تستدعيه Lua مباشرة مع كلا المعاملين كوسطاء.
التحدي
سهللنقم ببناء فئة Color تدعم عملية الطرح باستخدام عامل التشغيل -. يتم تمثيل الألوان بقيم RGB، وطرح لون من آخر ينشئ لوناً جديداً بفرق كل مكون.
ستقوم بتنظيم الكود الخاص بك عبر ملفين:
Color.lua: قم بتعريف فئة Color الخاصة بك مع المكوناتrوgوbالتي تمثل قيم الأحمر والأخضر والأزرق. قم بتضمين منشئ:new(r, g, b)وقم بتنفيذ الطريقة الوصفية (metamethod)__subبحيث يؤدي طرح لونين إلى إنشاء لون جديد بالفروق بين المكونات. تذكر أن__subيستخدم صيغة النقطة (dot syntax) ويستقبل كلا المعاملين كوسطاء.main.lua: قم باستدعاء وحدة Color الخاصة بك، وإنشاء مثيلات ألوان من المدخلات المقدمة، وطرحها، وعرض قيم RGB الناتجة.
ستتلقى ستة مدخلات:
- مكون اللون الأحمر للون الأول
- مكون اللون الأخضر للون الأول
- مكون اللون الأزرق للون الأول
- مكون اللون الأحمر للون الثاني
- مكون اللون الأخضر للون الثاني
- مكون اللون الأزرق للون الثاني
في ملفك الرئيسي، قم بإنشاء لونين بقيم RGB المعطاة، واطرح اللون الثاني من الأول باستخدام عامل التشغيل -، واطبع قيم r و g و b للون الناتج في أسطر منفصلة.
على سبيل المثال، إذا كانت المدخلات هي 200، 150، 100، 50، 30، 20، يجب أن يكون الناتج:
150
120
80اللون الأول (200, 150, 100) ناقص اللون الثاني (50, 30, 20) يساوي لوناً جديداً (150, 120, 80).
ورقة مرجعية
تحدد الطريقة الوصفية (metamethod) __sub سلوك المعامل -. وهي تستقبل معاملين وتُرجع كائناً جديداً.
function Color.__sub(c1, c2)
return Color:new(c1.r - c2.r, c1.g - c2.g, c1.b - c2.b)
endقم بتعريف __sub باستخدام النقطة (وليس النقطتين الرأسيتين) لأنها طريقة وصفية تستدعيها لغة Lua مباشرة مع تمرير كلا المعاملين كوسيطات.
local bright = Color:new(200, 150, 100)
local dim = Color:new(50, 30, 20)
local result = bright - dim
print(result.r, result.g, result.b) -- Output: 150 120 80جرّب بنفسك
-- استدعاء وحدة Color
local Color = require('Color')
-- قراءة قيم المدخلات
local r1 = tonumber(io.read())
local g1 = tonumber(io.read())
local b1 = tonumber(io.read())
local r2 = tonumber(io.read())
local g2 = tonumber(io.read())
local b2 = tonumber(io.read())
-- TODO: إنشاء مثيلين من Color باستخدام قيم RGB المعطاة
-- TODO: طرح اللون الثاني من اللون الأول باستخدام معامل -
-- TODO: طباعة قيم r و g و b للون الناتج في أسطر منفصلة
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس 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 للابنالمشترك مقابل الفريدملخص - التسلسل الهرمي للأشكال