הכנת מבנה הירושה
חלק מהיחידה תכנות מונחה עצמים במסלול ה-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 כדי למצוא את הטבלה הבאה שבה יש לחפש. כך מחלקות צאצא יורשות באופן אוטומטי את כל המתודות של מחלקות האב בלי להעתיק אותן.
אתגר
קלבואו נבנה את היררכיית הירושה הראשונה שלכם! תיצרו קשר פשוט בין מחלקת־אב למחלקת־ילד, שבו המחלקה 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"
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה תכנות מונחה עצמים
4פרויקט: בנק דיגיטלי
הגדרת הפרויקטפעולת הפקדה7פולימורפיזם ודריסת מתודות
דריסת מתודותקריאה למתודות של מחלקת האבטיפוסיות ברווזממשק משותףבדיקת טיפוססיכום – תפקידי עובדים2תבנית אב־טיפוס למחלקה
מושג אב־הטיפוסקישור באמצעות __indexהבנאי :new()אתחול מאפייניםמופעים עצמאייםסיכום – מפעל מכוניות5העמסת אופרטורים בתכנות מונחה עצמים
חיבור אובייקטיםחיסור אובייקטיםשרשור אובייקטיםהשוואת אובייקטים (<, >)חזרה – חישובים עם ארנק8כימוס
כללי מתן שמותClosures לשמירה על פרטיותגישה באמצעות Closuresטבלאות לקריאה בלבדלוגיקת אימותסיכום – כספת מאובטחת11תבניות עיצוב (בקצרה)
פונקציות Factoryטבלת Singletonתבנית IteratorObserver (מאזין)סיכום – מפעל Logger3מצב והתנהגות של אובייקטים
משתני מופעמתודות Getterמתודות Setterמאפיינים מחושביםעיצוב מחרוזותבדיקות שוויוןסיכום – ציון תלמיד6יסודות הירושה
הכנת מבנה הירושהירושת מתודותהרחבת הבנאיהוספת מתודות למחלקת הבתמשותף לעומת ייחודיסיכום – היררכיית צורותתרגלו בעצמכם: קומפיילר Lua אונליין