طرح الكائنات
جزء من قسم البرمجة كائنية التوجه في رحلة 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)، لكن البنية الأساسية للميتاميثود تظل كما هي.
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 بنقطة (وليس بنقطتين)، لأنه دالة ميتا تستدعيها Lua مباشرةً مع كلا المعاملين كوسيطين.
التحدي
سهللننشئ فئة Color تدعم الطرح باستخدام العامل -. تُمثَّل الألوان بقيم RGB، ويؤدي طرح لون من آخر إلى إنشاء لون جديد تكون مكوّناته هي فروق المكوّنات المناظرة.
ستوزّع التعليمات البرمجية على ملفين:
Color.lua: عرّف فئة Color بمكوّناتrوgوbالتي تمثّل قيم الأحمر والأخضر والأزرق. أضف مُنشئًا:new(r, g, b)ونفّذ طريقة التحويل__subبحيث يؤدي طرح لونين إلى إنشاء لون جديد بفروق المكوّنات المناظرة. تذكّر أن__subتستخدم صيغة النقطة وتتلقى المعاملين كوسيطتين.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).
جرّب بنفسك
-- استورد الوحدة 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 للون الناتج، كلًّا منها في سطر منفصل
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس البرمجة كائنية التوجه
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 عبر الإنترنت