جمع الكائنات
جزء من قسم Object Oriented Programming في رحلة Lua على Coddy — الدرس 26 من 70.
لقد رأيت بالفعل كيف تتيح لك الميثودات الوصفية (metamethods) مثل __tostring و __eq تخصيص كيفية تصرف الكائنات. الآن سنقوم بتوسيع هذا ليشمل العمليات الحسابية، بدءاً من الجمع.
تحدد الطريقة الوصفية (metamethod) __add ما يحدث عندما تستخدم المعامل + بين كائنين. عندما تصادف Lua التعبير a + b، فإنها تبحث عن __add في الجدول الوصفي (metatable) لأي من المعاملين.
local Vector = {}
Vector.__index = Vector
function Vector:new(x, y)
local obj = {x = x, y = y}
setmetatable(obj, Vector)
return obj
end
function Vector.__add(v1, v2)
return Vector:new(v1.x + v2.x, v1.y + v2.y)
endلاحظ أن __add يتم تعريفه بنقطة، وليس بنقطتين رأسيتين. فهو يستقبل كلا المعاملين كوسطاء (arguments) ويجب أن يعيد كائناً جديداً بدلاً من تعديل أي من الكائنين الأصليين. هذا يحافظ على العملية قابلة للتوقع وآمنة.
local a = Vector:new(3, 4)
local b = Vector:new(1, 2)
local c = a + b
print(c.x, c.y) -- الناتج: 4 6الفكرة الأساسية هي أن __add يجب أن يكون في الـ metatable نفسه (هنا، Vector)، وليس فقط في الكائن. وبما أننا قمنا بتعيين Vector كـ metatable لجميع النسخ، فإنها جميعاً تشترك في هذا السلوك تلقائياً.
التحدي
سهللنقم ببناء فئة Vector تدعم عملية الجمع باستخدام عامل التشغيل +. هذه هي خطوتك الأولى في تحميل عامل التشغيل بشكل زائد (operator overloading) — مما يجعل كائناتك تعمل بشكل طبيعي مع عوامل التشغيل المدمجة في Lua.
ستقوم بتنظيم الكود الخاص بك عبر ملفين:
Vector.lua: قم بتعريف فئة Vector الخاصة بك مع المكونينxوy. قم بتضمين منشئ:new(x, y)وقم بتنفيذ الطريقة الوصفية (metamethod) __addبحيث يؤدي جمع متجهين إلى إنشاء متجه جديد بالمكونات المدمجة. تذكر أن__addيستخدم صيغة النقطة (وليس النقطتين الرأسيتين) ويستقبل كلا المعاملين كوسطاء.main.lua: استدعِ وحدة Vector الخاصة بك، وأنشئ مثيلات للمتجهات، وأثبت أن جمعها يعطي النتيجة الصحيحة.
ستتلقى أربعة مدخلات:
- مكون x للمتجه الأول
- مكون y للمتجه الأول
- مكون x للمتجه الثاني
- مكون y للمتجه الثاني
في ملفك الرئيسي، أنشئ متجهين بالمكونات المعطاة، واجمعهما معاً باستخدام عامل التشغيل +، واطبع قيم x و y للمتجه الناتج في أسطر منفصلة.
على سبيل المثال، إذا كانت المدخلات هي 3، 4، 1، 2، يجب أن يكون الناتج:
4
6المتجه الأول (3, 4) زائد المتجه الثاني (1, 2) يساوي متجهاً جديداً (4, 6).
ورقة مرجعية
تحدد الطريقة الوصفية (metamethod) __add ما يحدث عند استخدام عامل التشغيل + بين كائنين.
عندما ترى لغة Lua التعبير a + b، فإنها تبحث عن __add في الجدول الوصفي (metatable) لأي من المعاملين.
local Vector = {}
Vector.__index = Vector
function Vector:new(x, y)
local obj = {x = x, y = y}
setmetatable(obj, Vector)
return obj
end
function Vector.__add(v1, v2)
return Vector:new(v1.x + v2.x, v1.y + v2.y)
endيتم تعريف __add باستخدام نقطة، وليس نقطتين رأسيتين. وهي تستقبل كلا المعاملين كوسطاء (arguments) ويجب أن تعيد كائناً جديداً بدلاً من تعديل أي من الكائنين الأصليين.
local a = Vector:new(3, 4)
local b = Vector:new(1, 2)
local c = a + b
print(c.x, c.y) -- Output: 4 6يجب أن تكون __add موجودة في الجدول الوصفي (metatable) نفسه، وليس فقط في الكائن.
جرّب بنفسك
-- Vector استيراد وحدة
local Vector = require('Vector')
-- قراءة المدخلات
local x1 = tonumber(io.read())
local y1 = tonumber(io.read())
local x2 = tonumber(io.read())
local y2 = tonumber(io.read())
-- TODO: باستخدام قيم المدخلات Vector قم بإنشاء مثيلين من
-- TODO: + قم بجمع المتجهين باستخدام عامل الجمع
-- TODO: الناتجة في أسطر منفصلة y و x قم بطباعة قيم
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس 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 للابنالمشترك مقابل الفريدملخص - التسلسل الهرمي للأشكال