Menu
Coddy logo textTech

הוספת מתודות למחלקת הבת

חלק מהיחידה תכנות מונחה עצמים במסלול ה-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 רגיל תיכשל, מכיוון שהמתודה הזאת לא קיימת שם. כך מאפשרת ירושה להתאים את ההתנהגות לצרכים מסוימים, תוך שמירה על פונקציונליות משותפת במקום אחד.

challenge icon

אתגר

קל

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

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

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

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