Menu
Coddy logo textTech

ירושת מתודות

חלק מהיחידה תכנות מונחה עצמים במסלול ה-Lua של Coddy. שיעור 32 מתוך 70.

לאחר יצירת קשר הירושה, מופעים של מחלקות־צאצא מקבלים גישה אוטומטית לכל המתודות של מחלקת־האב. הדבר מתרחש באמצעות שרשרת החיפוש של Lua: כשקוראים למתודה במופע, Lua מחפשת בכל טבלה מקושרת עד שהיא מוצאת את מה שמחפשים.

חשבו על ההגדרה הזו, שבה Animal מגדיר מתודה :breathe():

local Animal = {}
Animal.__index = Animal

function Animal:new()
    local obj = {}
    setmetatable(obj, Animal)
    return obj
end

function Animal:breathe()
    print("Breathing...")
end

-- Dog יורשת מ-Animal
local Dog = {}
Dog.__index = Dog
setmetatable(Dog, {__index = Animal})

function Dog:new()
    local obj = {}
    setmetatable(obj, Dog)
    return obj
end

עכשיו צפו במה שקורה כשאנחנו יוצרים Dog וקוראים למתודה של ההורה:

local buddy = Dog:new()
buddy:breathe()  -- פלט: Breathing...

המחלקה Dog מעולם לא הגדירה את :breathe(), ובכל זאת הוא עובד. Lua בודקת תחילה את buddy, לא מוצאת דבר, ואז בודקת את Dog, ועדיין לא מוצאת דבר, ולבסוף מוצאת אותו ב-Animal. ירושת המתודות האוטומטית הזו מאפשרת לך לכתוב התנהגות משותפת פעם אחת במחלקת האב, וכל מחלקת צאצא נהנית ממנה מיד.

challenge icon

אתגר

קל

בואו נבנה היררכיה פשוטה של יצורים כדי לראות ירושה של מתודות בפעולה! תיצרו מחלקת אב Animal ומחלקת בת Dog, ואז תדגימו שמופעים של Dog יכולים להשתמש במתודות שמוגדרות רק ב-Animal.

תארגנו את הקוד שלכם בשלושה קבצים:

  • Animal.lua: הגדירו את מחלקת האב באמצעות תבנית המחלקה הסטנדרטית. כללו בנאי :new(name) ששומר את שם החיה, ומתודה :speak() שמדפיסה את שם החיה ואחריו makes a sound. החזירו את המחלקה בסוף הקובץ.
  • Dog.lua: הגדירו את מחלקת הבת שיורשת מ-Animal. יבאו את המודול Animal והגדירו את קשר הירושה כדי ש-Dog תוכל לגשת למתודות של Animal. כללו בנאי :new(name) ששומר את השם ומגדיר את Dog כמטא-טבלה. מחלקת Dog לא אמורה להגדיר מתודת :speak() משלה. היא תירש אותה מ-Animal.
  • main.lua: יבאו את המודול Dog, קראו שם מהקלט, צרו מופע של Dog עם השם הזה וקראו למתודה :speak() שלו.

תקבלו קלט אחד: שם הכלב.

לדוגמה, אם הקלט הוא Buddy, הפלט צריך להיות:

Buddy makes a sound

הקסם כאן הוא שמחלקת Dog אף פעם לא מגדירה :speak(), ובכל זאת הקריאה למתודה במופע של Dog עובדת היטב. Lua עוקבת אחר שרשרת החיפוש ממופע Dog אל מחלקת Dog, ואז אל מחלקת Animal, שבה היא מוצאת את המתודה. כך ירושה פועלת!

נסו בעצמכם

-- main.lua: נקודת כניסה

local Dog = require('Dog')

-- קרא את שם הכלב מהקלט
local name = io.read()

-- TODO: צור מופע של Dog עם השם הנתון

-- TODO: קרא למתודה :speak() על מופע הכלב
quiz iconבחנו את עצמכם

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

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

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