Menu
Coddy logo textTech

קריאה למתודות של מחלקת האב

חלק מהיחידה תכנות מונחה עצמים במסלול ה-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 מכשכש בזנב בשמחה

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

challenge icon

אתגר

קל

בואו נבנה מערכת ברכות שבה 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
quiz iconבחנו את עצמכם

השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.

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

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