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