طرح الكائنات
جزء من قسم البرمجة كائنية التوجه في رحلة 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 باستخدام dot (وليس colon)، لأنه metamethod تستدعيه Lua مباشرةً مع both operands بوصفهما arguments.
التحدي
سهللنبنِ فئة Color تدعم الطرح باستخدام - operator. تُمثَّل الألوان بقيم RGB، ويؤدي طرح لون من لون آخر إلى إنشاء لون جديد يحتوي على difference كل component.
ستنظّم شيفرتك عبر ملفين:
Color.lua: Define فئة Color الخاصة بك مع componentsrوgوbالتي تمثل قيم الأحمر والأخضر والأزرق. ضمّن constructor:new(r, g, b)ونفّذ metamethod__subبحيث يؤدي طرح لونين إلى إنشاء لون جديد يحتوي على الفروق لكل component. Remember أن__subيستخدم صيغة النقطة ويتلقى كلا operands كوسيطين.main.lua: Require وحدة Color الخاصة بك، وأنشئ instances للألوان من المدخلات المقدمة، واطرحها، ثم اعرض قيم RGB resulting.
ستتلقى ستة inputs:
- المكوّن الأحمر للون first
- المكوّن الأخضر للون first
- المكوّن الأزرق للون first
- المكوّن الأحمر للون second
- المكوّن الأخضر للون second
- المكوّن الأزرق للون second
في ملف main الخاص بك، أنشئ لونين باستخدام قيم RGB given، واطرح اللون second من اللون first باستخدام - operator، ثم اطبع قيم r وg وb للون resulting في أسطر separate.
على سبيل المثال، إذا كانت المدخلات هي 200 و150 و100 و50 و30 و20، فيجب أن يكون الناتج:
150
120
80اللون first (200, 150, 100) مطروحًا منه اللون second (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 عبر الإنترنت