סיכום – היררכיית צורות
חלק מהיחידה תכנות מונחה עצמים במסלול ה-Lua של Coddy. שיעור 36 מתוך 70.
אתגר
קלבואו נבנה היררכיית צורות שלמה מאפס! תיצרו מחלקת אב 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, תוך שמירה על המאפיינים הייחודיים שלהן.
תקבלו שתי קלטות:
- נתוני עיגול: צבע ורדיוס המופרדים בפסיק (למשל,
blue,5) - נתוני ריבוע: צבע ואורך צלע המופרדים בפסיק (למשל,
red,4)
בקובץ הראשי, צרו עיגול וריבוע עם הערכים הנתונים. לאחר מכן הדפיסו את הדברים הבאים, כל אחד בשורה נפרדת:
- קראו ל־
:describe()עבור העיגול - קראו ל־
:describe()עבור הריבוע - הדפיסו את צבע העיגול באמצעות
:getColor() - הדפיסו את צבע הריבוע באמצעות
: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()
כל השיעורים ביחידה תכנות מונחה עצמים
4פרויקט: בנק דיגיטלי
הגדרת הפרויקטפעולת הפקדה7פולימורפיזם ודריסת מתודות
דריסת מתודותקריאה למתודות של מחלקת האבטיפוסיות ברווזממשק משותףבדיקת טיפוססיכום – תפקידי עובדים2תבנית אב־טיפוס למחלקה
מושג אב־הטיפוסקישור באמצעות __indexהבנאי :new()אתחול מאפייניםמופעים עצמאייםסיכום – מפעל מכוניות5העמסת אופרטורים בתכנות מונחה עצמים
חיבור אובייקטיםחיסור אובייקטיםשרשור אובייקטיםהשוואת אובייקטים (<, >)חזרה – חישובים עם ארנק8כימוס
כללי מתן שמותClosures לשמירה על פרטיותגישה באמצעות Closuresטבלאות לקריאה בלבדלוגיקת אימותסיכום – כספת מאובטחת11תבניות עיצוב (בקצרה)
פונקציות Factoryטבלת Singletonתבנית IteratorObserver (מאזין)סיכום – מפעל Logger3מצב והתנהגות של אובייקטים
משתני מופעמתודות Getterמתודות Setterמאפיינים מחושביםעיצוב מחרוזותבדיקות שוויוןסיכום – ציון תלמיד6יסודות הירושה
הכנת מבנה הירושהירושת מתודותהרחבת הבנאיהוספת מתודות למחלקת הבתמשותף לעומת ייחודיסיכום – היררכיית צורותתרגלו בעצמכם: קומפיילר Lua אונליין