Menu
Coddy logo textTech

הכנת מבנה הירושה

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

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

התובנה המרכזית היא שלטבלת מחלקה עצמה יכולה להיות מטא־טבלה. כש-Lua לא מצליחה למצוא משהו במחלקת הבת, היא מחפשת ב-__index של המטא־טבלה של מחלקת הבת, שמצביע למחלקת האב.

-- מחלקת אב
local Animal = {}
Animal.__index = Animal

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

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

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

-- מחלקת בת
local Dog = {}
Dog.__index = Dog
setmetatable(Dog, {__index = Animal})

השורה היחידה הזו, setmetatable(Dog, {__index = Animal}), יוצרת את קישור הירושה. כשמופע של Dog קורא למתודה שאינה נמצאת ב-Dog, Lua בודקת את Animal.

שרשרת החיפוש פועלת כך: מופע → Dog → Animal. בכל שלב נעשה שימוש ב־__index כדי למצוא את הטבלה הבאה שבה יש לחפש. כך מחלקות צאצא יורשות באופן אוטומטי את כל המתודות של מחלקות האב בלי להעתיק אותן.

challenge icon

אתגר

קל

בואו נבנה את היררכיית הירושה הראשונה שלכם! תיצרו קשר פשוט בין מחלקת־אב למחלקת־ילד, שבו המחלקה Machine משמשת כמחלקת בסיס, והמחלקה Robot יורשת ממנה.

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

  • Machine.lua: הגדירו את מחלקת־האב שלכם לפי התבנית המקובלת למחלקות. כללו בנאי :new() ומתודה :status() שמדפיסה Machine is operational. אל תשכחו להגדיר את __index ולהחזיר את המחלקה בסוף הקובץ.
  • Robot.lua: הגדירו את מחלקת־הילד שיורשת מ־Machine. טענו את המודול Machine, הגדירו את הטבלה Robot עם __index משלה, וצרו את קשר הירושה באמצעות setmetatable(Robot, {__index = Machine}). כללו בנאי :new() שיוצר מופע שבו Robot היא טבלת המטא.
  • main.lua: חברו את הכול יחד על ידי טעינת מודול Robot, יצירת מופע של Robot וקריאה למתודה :status() שעברה בירושה.

הרעיון המרכזי כאן הוא שמחלקת Robot לא מגדירה בעצמה את :status(). היא יורשת את המתודה הזו מ־Machine דרך שרשרת טבלאות המטא. כשאתם קוראים ל־:status() במופע של Robot, Lua תחפש תחילה ב־Robot, לא תמצא את המתודה, ואז תמשיך דרך הקישור __index אל Machine, שם תמצא את המתודה.

הפלט שלכם אמור להיות:

Machine is operational

השורה היחידה הזו מוכיחה שהירושה פועלת. מופע Robot שלכם הצליח לגשת למתודה שהוגדרה רק במחלקת־האב שלו!

נסו בעצמכם

-- main.lua: לחבר את הכול יחד

-- TODO: לטעון את המודול Robot

-- TODO: ליצור מופע של Robot באמצעות Robot:new()

-- TODO: לקרוא למתודה :status() שעברה בירושה על המופע שלך של Robot
-- זה אמור להדפיס "Machine is operational"
quiz iconבחנו את עצמכם

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

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

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