Menu
CoddyTech

طرح الكائنات

جزء من قسم البرمجة كائنية التوجه في رحلة 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 مباشرةً مع كلا المعاملين كوسيطين.

challenge icon

التحدي

سهل

لننشئ فئة Color تدعم الطرح باستخدام العامل -. تُمثَّل الألوان بقيم RGB، ويؤدي طرح لون من آخر إلى إنشاء لون جديد تكون مكوّناته هي فروق المكوّنات المناظرة.

ستوزّع التعليمات البرمجية على ملفين:

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

ستتلقى ستة مدخلات:

  1. مكوّن الأحمر للون الأول
  2. مكوّن الأخضر للون الأول
  3. مكوّن الأزرق للون الأول
  4. مكوّن الأحمر للون الثاني
  5. مكوّن الأخضر للون الثاني
  6. مكوّن الأزرق للون الثاني

في ملفك الرئيسي، أنشئ لونين بقيم 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 للون الناتج، كلًّا منها في سطر منفصل
quiz iconاختبر نفسك

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

جميع دروس البرمجة كائنية التوجه

تدرّب بنفسك: مترجم Lua عبر الإنترنت