Menu
Coddy logo textTech

סיכום – היררכיית צורות

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

challenge icon

אתגר

קל

בואו נבנה היררכיית צורות שלמה מאפס! תיצרו מחלקת אב Shape שממנה יורשות כל הצורות, ואז תבנו מחלקות בת Circle ו־Square, שלכל אחת מהן יהיו מאפיינים ייחודיים משלה, לצד פונקציונליות משותפת.

תארגנו את הקוד שלכם בארבעה קבצים:

  • Shape.lua: מחלקת הבסיס שממנה יירשו כל הצורות. צריכה להיות בה בנאית :new(color) ששומרת את צבע הצורה, ומתודה :getColor() שמחזירה אותו. המאפיין המשותף הזה פירושו שלכל צורה, בין אם היא עיגול או ריבוע, יהיה צבע.
  • Circle.lua: מחלקת בת שיורשת מ־Shape. הבנאית שלה, :new(color, radius), צריכה לקרוא לבנאית של מחלקת האב עבור הצבע, ואז להוסיף את הרדיוס כמאפיין ייחודי. הוסיפו מתודה :describe() שמדפיסה פרטים על העיגול.
  • Square.lua: מחלקת בת נוספת שיורשת מ־Shape. הבנאית שלה, :new(color, side), צריכה גם היא לקרוא לבנאית של מחלקת האב, ואז לשמור את אורך הצלע. הוסיפו גם מתודה :describe() עבור ריבועים.
  • main.lua: חברו את הכול יחד על ידי יצירת מופעים של שתי הצורות והדגמה של ירושתן התקינה מ־Shape, תוך שמירה על המאפיינים הייחודיים שלהן.

תקבלו שתי קלטות:

  1. נתוני עיגול: צבע ורדיוס המופרדים בפסיק (למשל, blue,5)
  2. נתוני ריבוע: צבע ואורך צלע המופרדים בפסיק (למשל, red,4)

בקובץ הראשי, צרו עיגול וריבוע עם הערכים הנתונים. לאחר מכן הדפיסו את הדברים הבאים, כל אחד בשורה נפרדת:

  1. קראו ל־:describe() עבור העיגול
  2. קראו ל־:describe() עבור הריבוע
  3. הדפיסו את צבע העיגול באמצעות :getColor()
  4. הדפיסו את צבע הריבוע באמצעות :getColor()

המתודה :describe() של Circle צריכה להדפיס:

Circle with radius {radius}

המתודה :describe() של Square צריכה להדפיס:

Square with side {side}

לדוגמה, אם הקלטות הן blue,5 ו־red,4, הפלט צריך להיות:

Circle with radius 5
Square with side 4
blue
red

כך מודגם דפוס הירושה השלם: שתי הצורות יורשות את :getColor() מ־Shape (הן אף פעם לא מגדירות אותה בעצמן), ולכל אחת מהן יש מאפיין ייחודי משלה ומתודה :describe()!

נסו בעצמכם

-- main.lua: לאחד את הכול

local Circle = require('Circle')
local Square = require('Square')

-- קריאת קלט עבור עיגול (color,radius)
local circleInput = io.read()
local circleColor, circleRadius = circleInput:match("([^,]+),([^,]+)")
circleRadius = tonumber(circleRadius)

-- קריאת קלט עבור ריבוע (color,side)
local squareInput = io.read()
local squareColor, squareSide = squareInput:match("([^,]+),([^,]+)")
squareSide = tonumber(squareSide)

-- TODO: ליצור מופע של Circle עם הצבע והרדיוס הנתונים

-- TODO: ליצור מופע של Square עם הצבע ואורך הצלע הנתונים

-- TODO: לקרוא ל־:describe() על העיגול

-- TODO: לקרוא ל־:describe() על הריבוע

-- TODO: להדפיס את צבע העיגול באמצעות :getColor()

-- TODO: להדפיס את צבע הריבוע באמצעות :getColor()

כל השיעורים ביחידה תכנות מונחה עצמים

תרגלו בעצמכם: קומפיילר Lua אונליין