הוספת מתודות למחלקת הבת
חלק מהיחידה תכנות מונחה עצמים במסלול ה-Lua של Coddy. שיעור 34 מתוך 70.
ירושה מאפשרת למחלקות צאצא לגשת למתודות של מחלקות אב, אבל העוצמה האמיתית נובעת מהוספת מתודות חדשות שיש רק למחלקת הצאצא. Dog יכול לעשות כל מה ש-Animal יכול, ובנוסף דברים ייחודיים לכלבים, כמו לנבוח.
הוספת מתודה ייחודית למחלקת הבת היא פשוטה: פשוט מגדירים אותה בטבלת המחלקה של הבת. מכיוון שמופעים מחפשים מתודות תחילה במחלקה שלהם, הם ימצאו את המתודה החדשה בלי להשפיע על מחלקת האב.
local Animal = {}
Animal.__index = Animal
function Animal:new(name)
local obj = {name = name}
setmetatable(obj, Animal)
return obj
end
function Animal:breathe()
print(self.name .. " is breathing")
end
-- Dog יורשת מ-Animal
local Dog = {}
Dog.__index = Dog
setmetatable(Dog, {__index = Animal})
function Dog:new(name)
local obj = Animal.new(Animal, name)
setmetatable(obj, Dog)
return obj
end
-- מתודה חדשה רק ב-Dog
function Dog:bark()
print(self.name .. " says: Woof!")
endכעת מופעי Dog יכולים להשתמש גם במתודות שעברו בירושה וגם במתודות ייחודיות:
local buddy = Dog:new("Buddy")
buddy:breathe() -- פלט: Buddy is breathing (בירושה)
buddy:bark() -- פלט: Buddy says: Woof! (ייחודי למחלקת הבת)מחלקת האב נשארת ללא שינוי: קריאה ל־:bark() על Animal רגיל תיכשל, מכיוון שהמתודה הזאת לא קיימת שם. כך מאפשרת ירושה להתאים את ההתנהגות לצרכים מסוימים, תוך שמירה על פונקציונליות משותפת במקום אחד.
אתגר
קלבואו נבנה היררכיית חיות מחמד שבה לחתולים יש יכולת מיוחדת משלהם! תיצרו מחלקת אב Pet ומחלקת בת Cat, שבה Cat יורשת הכול מ-Pet, אבל יש לה גם מתודה ייחודית שרק חתולים יכולים לבצע.
תארגנו את הקוד שלכם בשלושה קבצים:
Pet.lua: הגדירו את מחלקת האב שלכם עם בנאי:new(name)ששומר את שם חיית המחמד. כללו מתודת:greet()שמדפיסה את שם חיית המחמד ואחריוsays hello. הגדירו את תבנית המחלקה הסטנדרטית והחזירו את המחלקה.Cat.lua: הגדירו את מחלקת הבת שיורשת מ-Pet. הבנאי:new(name)של Cat צריך לקרוא לבנאי של מחלקת האב כדי לאתחל את השם, ואז לקשר מחדש את טבלת המטא ל-Cat. הוסיפו מתודת:purr()ייחודית למחלקת הבת, שמדפיסה את שם החתול ואחריוpurrs contentedly. המתודה הזאת קיימת רק ב-Cat: ל-Pet אין אותה!main.lua: טענו את מודול Cat, קראו שם מהקלט, צרו מופע של Cat והדגימו שהוא יכול להשתמש גם במתודת:greet()שירש וגם במתודת:purr()הייחודית שלו.
תקבלו קלט אחד: שם החתול.
בקובץ הראשי שלכם, צרו Cat עם השם הנתון, ואז קראו ל-:greet() ואחריו ל-:purr(), בשורות נפרדות.
לדוגמה, אם הקלט הוא Whiskers, הפלט אמור להיות:
Whiskers says hello
Whiskers purrs contentedlyהשורה הראשונה מגיעה ממתודת :greet() שעוברת בירושה ומוגדרת ב-Pet, ואילו השורה השנייה מגיעה ממתודת :purr() שקיימת רק ב-Cat. כך אפשר לראות כיצד מחלקות בת יכולות לעשות כל מה שמחלקת האב שלהן יכולה לעשות, וגם לבצע התנהגויות ייחודיות משלהן!
נסו בעצמכם
-- main.lua: צור Cat והדגם ירושה
local Cat = require('Cat')
-- קרא את שם החתול מהקלט
local name = io.read()
-- TODO: צור מופע של Cat עם השם הנתון
-- TODO: קרא למתודה :greet() שעברה בירושה (מ־Pet)
-- TODO: קרא למתודה :purr() הייחודית ל־Cat
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה תכנות מונחה עצמים
4פרויקט: בנק דיגיטלי
הגדרת הפרויקטפעולת הפקדה7פולימורפיזם ודריסת מתודות
דריסת מתודותקריאה למתודות של מחלקת האבטיפוסיות ברווזממשק משותףבדיקת טיפוססיכום – תפקידי עובדים2תבנית אב־טיפוס למחלקה
מושג אב־הטיפוסקישור באמצעות __indexהבנאי :new()אתחול מאפייניםמופעים עצמאייםסיכום – מפעל מכוניות5העמסת אופרטורים בתכנות מונחה עצמים
חיבור אובייקטיםחיסור אובייקטיםשרשור אובייקטיםהשוואת אובייקטים (<, >)חזרה – חישובים עם ארנק8כימוס
כללי מתן שמותClosures לשמירה על פרטיותגישה באמצעות Closuresטבלאות לקריאה בלבדלוגיקת אימותסיכום – כספת מאובטחת11תבניות עיצוב (בקצרה)
פונקציות Factoryטבלת Singletonתבנית IteratorObserver (מאזין)סיכום – מפעל Logger3מצב והתנהגות של אובייקטים
משתני מופעמתודות Getterמתודות Setterמאפיינים מחושביםעיצוב מחרוזותבדיקות שוויוןסיכום – ציון תלמיד6יסודות הירושה
הכנת מבנה הירושהירושת מתודותהרחבת הבנאיהוספת מתודות למחלקת הבתמשותף לעומת ייחודיסיכום – היררכיית צורותתרגלו בעצמכם: קומפיילר Lua אונליין