جمع الكائنات
جزء من قسم البرمجة كائنية التوجه في رحلة Lua على Coddy. الدرس 26 من 70.
لقد رأيتَ بالفعل كيف تتيح لك metamethods مثل __tostring و__eq تخصيص طريقة تصرّف الكائنات. والآن سنوسّع ذلك ليشمل العمليات الحسابية، بدءًا من الجمع.
تحدد __add metamethod ما يحدث عند استخدام + operator بين كائنين. عندما يرى 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 مُعرَّفة باستخدام نقطة، وليس نقطتين. تستقبل كلا operands كوسيطين، وينبغي أن تُعيد كائنًا جديدًا بدلًا من تعديل أيٍّ من الكائنين الأصليين. وهذا يجعل العملية قابلة للتنبؤ وآمنة.
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 لجميع instances، فإنها تشترك جميعًا في هذا السلوك تلقائيًا.
التحدي
سهللننشئ فئة Vector تدعم الجمع باستخدام عامل التشغيل +. هذه هي خطوتك الأولى نحو التحميل الزائد لعوامل التشغيل، مما يجعل كائناتك تعمل بشكل طبيعي مع عوامل التشغيل المضمّنة في Lua.
ستنظّم التعليمات البرمجية عبر ملفين:
Vector.lua: عرّف فئة Vector مع مكوّنيxوy. أدرج مُنشئ:new(x, y)ونفّذ metamethod__addبحيث يؤدي جمع متجهين إلى إنشاء متجه جديد بالمكوّنين combined. تذكّر أن__addيستخدم صيغة النقطة (وليس النقطتين) ويتلقى كلا operand كوسيطين.main.lua: اطلب وحدة Vector، وأنشئ مثيلات للمتجهات، وأثبت أن جمعها ينتج النتيجة الصحيحة.
ستتلقى أربع قيم إدخال:
- مكوّن x للمتجه الأول
- مكوّن y للمتجه الأول
- مكوّن x للمتجه الثاني
- مكوّن y للمتجه الثاني
في ملفك الرئيسي، أنشئ متجهين بالمكوّنات المعطاة، واجمعهما باستخدام عامل التشغيل +، واطبع قيمتي x وy للمتجه الناتج في سطرين منفصلين.
على سبيل المثال، إذا كانت المدخلات هي 3 و4 و1 و2، فينبغي أن يكون الناتج:
4
6المتجه الأول (3، 4) مضافًا إليه المتجه الثاني (1، 2) يساوي متجهًا جديدًا (4، 6).
تنسيق الإخراج المطلوب:جرّب بنفسك
-- تتطلب وحدة 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: اطبع قيم x و y للمتجه الناتج في سطرين منفصلين
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس البرمجة كائنية التوجه
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 عبر الإنترنت