Menu
Coddy logo textTech
flag Ar iconالعربيةdown icon

مجموعة الأشكال

جزء من قسم البرمجة كائنية التوجه في رحلة Lua على Coddy. الدرس 59 من 70.

challenge icon

التحدي

سهل

الآن بعد أن أصبح لديك كل من فئتي Rectangle و Circle بوظائف كاملة، دعنا ننشئ فئة ShapeCollection يمكنها إدارة أشكال متعددة معاً. هذا مثال رائع على التركيب (composition) — حيث أن المجموعة "تمتلك" أشكالاً بدلاً من أن "تكون" شكلاً.

ستقوم بإضافة ملف جديد إلى مشروعك المتنامي:

  • Shape.lua: فئة Shape الأساسية الخاصة بك (دون تغيير).
  • Rectangle.lua: فئة Rectangle الخاصة بك مع :getArea() و :getPerimeter().
  • Circle.lua: فئة Circle الخاصة بك مع :getArea() و :getPerimeter().
  • ShapeCollection.lua: أنشئ فئة جديدة تخزن الأشكال داخلياً. قم بتضمين منشئ :new() يقوم بتهيئة قائمة فارغة من الأشكال، وطريقة :addShape(shape) تضيف أي شكل إلى المجموعة، وطريقة :count() تعيد عدد الأشكال المخزنة حالياً.
  • main.lua: اجمع كل شيء معاً عن طريق استدعاء الوحدات (modules) الخاصة بك. اقرأ الأبعاد من المدخلات، وأنشئ Rectangle و Circle، وأضفهما معاً إلى ShapeCollection، ثم اطبع عدد عناصر المجموعة متبوعاً باسم كل شكل (بالترتيب الذي تمت إضافته به).

لا تحتاج ShapeCollection إلى معرفة ما إذا كانت تخزن مستطيلات أم دوائر — فهي تحتفظ بالأشكال فحسب. يوضح هذا كيف يتيح لك تعدد الأشكال (polymorphism) التعامل مع أنواع كائنات مختلفة بشكل موحد من خلال واجهة مشتركة.

المدخلات: ثلاثة أسطر — العرض (رقم)، والارتفاع (رقم)، ونصف القطر (رقم).

المخرجات: ثلاثة أسطر — عدد الأشكال في المجموعة، ثم اسم أول شكل تمت إضافته، ثم اسم ثاني شكل تمت إضافته.

جرّب بنفسك

-- استدعاء وحدة Rectangle
local Rectangle = require('Rectangle')

-- استدعاء وحدة Circle
local Circle = require('Circle')

-- استدعاء وحدة ShapeCollection
local ShapeCollection = require('ShapeCollection')

-- قراءة width و height من المدخلات
local width = tonumber(io.read())
local height = tonumber(io.read())
local radius = tonumber(io.read())

-- إنشاء مثيل Rectangle جديد بالأبعاد المعطاة
local rect = Rectangle:new(width, height)

-- إنشاء مثيل Circle جديد بنصف القطر المعطى
local circ = Circle:new(radius)

-- إنشاء ShapeCollection جديد
local collection = ShapeCollection:new()

-- إضافة كلا الشكلين إلى المجموعة
collection:addShape(rect)
collection:addShape(circ)

-- طباعة عدد الأشكال في المجموعة
print(collection:count())

-- طباعة اسم كل شكل بترتيب إضافتها
for i = 1, collection:count() do
    print(collection.shapes[i]:getName())
end

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

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