קריאה למתודות של מחלקת האב
חלק מהיחידה תכנות מונחה עצמים במסלול ה-Lua של Coddy. שיעור 38 מתוך 70.
לפעמים, דריסת מתודה לחלוטין אינה מה שרוצים. במקום זאת, ייתכן שתרצו להרחיב את ההתנהגות של מחלקת האב: לבצע את מה שמחלקת האב עושה, ואז להוסיף משהו נוסף. כדי לעשות זאת, אפשר לקרוא למתודה של מחלקת האב ישירות מתוך המימוש הדורס של מחלקת הבן.
הטכניקה משתמשת בתחביר נקודה עם שם מחלקת האב, תוך העברה מפורשת של self כארגומנט הראשון:
local Animal = {}
Animal.__index = Animal
function Animal:new(name)
local obj = {name = name}
setmetatable(obj, Animal)
return obj
end
function Animal:speak()
print(self.name .. " makes a sound")
end
-- Dog מרחיב את ההתנהגות של מחלקת האב
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
function Dog:speak()
Animal.speak(self) -- קרא תחילה למתודה של מחלקת האב
print(self.name .. " wags tail happily")
endהשורה המרכזית היא Animal.speak(self). באמצעות שימוש בתחביר נקודה על מחלקת האב והעברה ידנית של self, אנחנו מפעילים את השיטה המקורית לפני הוספת ההתנהגות שלנו:
local buddy = Dog:new("Buddy")
buddy:speak()
-- פלט:
-- Buddy משמיע קול
-- Buddy מכשכש בזנב בשמחההתבנית הזאת שימושית כשהמתודה של מחלקת האב מבצעת עבודה חשובה שלא רוצים לשכפל. המחלקה היורשת יכולה להריץ תחילה את הלוגיקה של מחלקת האב, בסוף או אפילו באמצע הקוד שלה, וכך יש לך שליטה מלאה על שילוב ההתנהגויות.
אתגר
קלבואו נבנה מערכת ברכות שבה FormalPerson מרחיבה את ההתנהגות של Person רגילה! במקום להחליף לחלוטין את האופן שבו אדם מציג את עצמו, הגרסה הרשמית תבצע תחילה את ההצגה הרגילה, ואז תוסיף נופך מנומס נוסף.
תחלקו את הקוד שלכם בין שלושה קבצים:
Person.lua: מחלקת הבסיס שלכם, עם בנאי:new(name)ששומר את שמו של האדם. כללו שיטה:introduce()שמדפיסה את שמו של האדם ולאחריו אתsays hi. זוהי התנהגות הבסיס שאותה נרחיב.FormalPerson.lua: מחלקת בת שיורשת מ-Person. הבנאי שלה צריך לקרוא לבנאי של מחלקת האב כדי לטפל בשם. דרסו את השיטה:introduce(), אבל במקום להחליף לחלוטין את ההתנהגות של מחלקת האב, קראו תחילה לשיטה של מחלקת האב באמצעותPerson.introduce(self), ואז הדפיסו שורה נוספת עם שמו של האדם ולאחריהbows politely.main.lua: ייבאו את המודול FormalPerson, קראו שם מהקלט, צרו מופע של FormalPerson וקראו ל-:introduce()כדי לראות את שתי ההתנהגויות המשולבות.
תקבלו קלט אחד: שמו של האדם.
כשקוראים ל-:introduce() על FormalPerson, אמורות להתקבל שתי שורות פלט: הראשונה מהשיטה של מחלקת האב, והשנייה מהתוספת של מחלקת הבת:
{name} says hi
{name} bows politelyלדוגמה, אם הקלט הוא Eleanor, הפלט אמור להיות:
Eleanor says hi
Eleanor bows politelyהתובנה המרכזית כאן היא ש-FormalPerson לא משכפלת את הלוגיקה של "says hi". היא מעבירה את העבודה הזאת לשיטה של מחלקת האב, ואז מוסיפה עליה התנהגות ייחודית משלה. כך הקוד נשאר נקי, והדבר מדגים כיצד מחלקות בת יכולות להרחיב את הפונקציונליות של מחלקת האב במקום להחליף אותה!
נסו בעצמכם
-- main.lua: נקודת הכניסה למערכת הברכות
local FormalPerson = require('FormalPerson')
-- קרא את שם האדם מהקלט
local name = io.read()
-- TODO: צור מופע של FormalPerson עם השם הנתון
-- TODO: קרא למתודה introduce של המופע של FormalPerson
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה תכנות מונחה עצמים
4פרויקט: בנק דיגיטלי
הגדרת הפרויקטפעולת הפקדה7פולימורפיזם ודריסת מתודות
דריסת מתודותקריאה למתודות של מחלקת האבטיפוסיות ברווזממשק משותףבדיקת טיפוססיכום – תפקידי עובדים2תבנית אב־טיפוס למחלקה
מושג אב־הטיפוסקישור באמצעות __indexהבנאי :new()אתחול מאפייניםמופעים עצמאייםסיכום – מפעל מכוניות5העמסת אופרטורים בתכנות מונחה עצמים
חיבור אובייקטיםחיסור אובייקטיםשרשור אובייקטיםהשוואת אובייקטים (<, >)חזרה – חישובים עם ארנק8כימוס
כללי מתן שמותClosures לשמירה על פרטיותגישה באמצעות Closuresטבלאות לקריאה בלבדלוגיקת אימותסיכום – כספת מאובטחת11תבניות עיצוב (בקצרה)
פונקציות Factoryטבלת Singletonתבנית IteratorObserver (מאזין)סיכום – מפעל Logger3מצב והתנהגות של אובייקטים
משתני מופעמתודות Getterמתודות Setterמאפיינים מחושביםעיצוב מחרוזותבדיקות שוויוןסיכום – ציון תלמיד6יסודות הירושה
הכנת מבנה הירושהירושת מתודותהרחבת הבנאיהוספת מתודות למחלקת הבתמשותף לעומת ייחודיסיכום – היררכיית צורותתרגלו בעצמכם: קומפיילר Lua אונליין