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

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

جزء من قسم Object Oriented Programming في رحلة 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

جميع دروس Object Oriented Programming