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

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

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

challenge icon

التحدي

سهل

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

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

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

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

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

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

جرّب بنفسك

-- تتطلب وحدة Rectangle
local Rectangle = require('Rectangle')

-- تتطلب وحدة Circle
local Circle = require('Circle')

-- تتطلب وحدة ShapeCollection
local ShapeCollection = require('ShapeCollection')

-- اقرأ العرض والارتفاع من الإدخال
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 عبر الإنترنت