Menu
Coddy logo textTech

אוסף צורות

חלק מהיחידה תכנות מונחה עצמים במסלול ה-Lua של Coddy. שיעור 59 מתוך 70.

challenge icon

אתגר

קל

עכשיו, כשיש לך מחלקות Rectangle ו-Circle עם פונקציונליות מלאה, בוא ניצור מחלקת ShapeCollection שתוכל לנהל כמה צורות יחד. זו דוגמה מצוינת להרכבה: האוסף "has" צורות במקום "להיות" צורה.

תוסיף קובץ חדש לפרויקט ההולך וגדל שלך:

  • 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 לא צריכה לדעת אם היא מאחסנת מלבנים או מעגלים. היא פשוט מכילה צורות. כך מודגם שפולימורפיזם מאפשר להתייחס לסוגי אובייקטים שונים באופן אחיד באמצעות ממשק משותף.

קלט: שלוש שורות: רוחב (מספר), גובה (מספר) ורדיוס (מספר).

פלט: שלוש שורות: מספר הצורות באוסף, לאחר מכן השם של הצורה הראשונה שנוספה, ואז השם של הצורה השנייה שנוספה.

נסו בעצמכם

-- טען את המודול 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 אונליין