קשר מסוג יש-לו
חלק מהיחידה תכנות מונחה עצמים במסלול ה-Lua של Coddy. שיעור 49 מתוך 70.
לאורך הקורס הזה השתמשת בירושה כדי לשתף התנהגות בין מחלקות: כלב הוא סוג של חיה.
לפעמים, אובייקטים אינם חולקים עץ משפחה; במקום זאת, אובייקט אחד פשוט מכיל אובייקט אחר. זה נקרא הרכבה, וזה מדמה קשר מסוג „יש לו”.
חשבו על מכונית. מכונית אינה סוג של מנוע. יש לה מנוע. המנוע הוא אובייקט נפרד שקיים בתוך המכונית:
local Engine = {}
Engine.__index = Engine
function Engine:new(horsepower)
local obj = {horsepower = horsepower}
setmetatable(obj, Engine)
return obj
end
local Car = {}
Car.__index = Car
function Car:new(model, engine)
local obj = {
model = model,
engine = engine -- אחסן את אובייקט Engine בתוך Car
}
setmetatable(obj, Car)
return obj
endכשיוצרים מכונית, מעבירים אובייקט מנוע קיים לבנאי שלה:
local myEngine = Engine:new(200)
local myCar = Car:new("Sedan", myEngine)
print(myCar.engine.horsepower) -- 200המכונית לא יורשת מהמנוע. היא פשוט מחזיקה הפניה אליו. כך שתי המחלקות נשארות בלתי תלויות. אפשר להחליף אותו במנוע אחר, או להשתמש באותה מחלקת מנוע באופנוע.
הרכבה מעניקה לך גמישות שירושה לא יכולה להעניק: במקום לכלוא אובייקטים בהיררכיה משפחתית נוקשה, אתה מרכיב אותם מחלקים.
אתגר
קלבואו נבנה מערכת מחשב באמצעות הרכבה! במקום ירושה, תיצרו Computer שיש לו CPU בתוכו: כך תדגימו את הקשר ״יש לו״.
תארגנו את הקוד בשלושה קבצים:
CPU.lua: צרו מחלקת CPU עם בנאי:new(brand, speed)ששומר את שם המותג ואת המהירות ב-GHz. כללו מתודת:getInfo()שמחזירה מחרוזת בפורמט:{brand} @ {speed}GHzComputer.lua: צרו מחלקת Computer שהבנאי שלה:new(model, cpu)מקבל שם דגם ואובייקט CPU. ה-Computer שומר את אובייקט ה-CPU בתוכו (הרכבה!). כללו מתודת:describe()שמדפיסה את דגם המחשב ואת המידע של ה-CPU שלו.main.lua: חברו את כל החלקים! קראו קלטים עבור מותג ה-CPU, מהירות ה-CPU ודגם המחשב. צרו תחילה אובייקט CPU, ואז העבירו אותו לבנאי של Computer. לבסוף, קראו למתודת:describe()של המחשב.
תקבלו שלושה קלטים:
- מותג ה-CPU (מחרוזת)
- מהירות ה-CPU ב-GHz (מספר)
- שם דגם המחשב (מחרוזת)
הפלט שלכם צריך להציג את תיאור המחשב, הכולל מידע מה-CPU שמוכל בתוכו:
Model: {model}
CPU: {brand} @ {speed}GHzלדוגמה, אם הקלטים הם Intel, 3.5 ו-WorkStation, הפלט צריך להיות:
Model: WorkStation
CPU: Intel @ 3.5GHzשימו לב שה-Computer אינו יורש מ-CPU. הוא פשוט מחזיק הפניה אליו. המתודה :describe() של Computer ניגשת לנתוני ה-CPU דרך האובייקט השמור, ומדגימה כיצד הרכבה מאפשרת לכם לבנות אובייקטים מורכבים מחלקים פשוטים יותר!
נסו בעצמכם
-- main.lua
-- שלבו את הכול באמצעות קומפוזיציה
local CPU = require('CPU')
local Computer = require('Computer')
-- קראו את נתוני הקלט
local cpuBrand = io.read()
local cpuSpeed = tonumber(io.read())
local computerModel = io.read()
-- TODO: צרו אובייקט CPU עם המותג והמהירות
-- TODO: צרו אובייקט Computer עם הדגם ואובייקט ה-CPU
-- TODO: קראו למתודה describe() של המחשב כדי להדפיס את הפלט
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה תכנות מונחה עצמים
4פרויקט: בנק דיגיטלי
הגדרת הפרויקטפעולת הפקדה7פולימורפיזם ודריסת מתודות
דריסת מתודותקריאה למתודות של מחלקת האבטיפוסיות ברווזממשק משותףבדיקת טיפוססיכום – תפקידי עובדים2תבנית אב־טיפוס למחלקה
מושג אב־הטיפוסקישור באמצעות __indexהבנאי :new()אתחול מאפייניםמופעים עצמאייםסיכום – מפעל מכוניות5העמסת אופרטורים בתכנות מונחה עצמים
חיבור אובייקטיםחיסור אובייקטיםשרשור אובייקטיםהשוואת אובייקטים (<, >)חזרה – חישובים עם ארנק8כימוס
כללי מתן שמותClosures לשמירה על פרטיותגישה באמצעות Closuresטבלאות לקריאה בלבדלוגיקת אימותסיכום – כספת מאובטחת11תבניות עיצוב (בקצרה)
פונקציות Factoryטבלת Singletonתבנית IteratorObserver (מאזין)סיכום – מפעל Logger3מצב והתנהגות של אובייקטים
משתני מופעמתודות Getterמתודות Setterמאפיינים מחושביםעיצוב מחרוזותבדיקות שוויוןסיכום – ציון תלמיד6יסודות הירושה
הכנת מבנה הירושהירושת מתודותהרחבת הבנאיהוספת מתודות למחלקת הבתמשותף לעומת ייחודיסיכום – היררכיית צורות9קומפוזיציה ומיקסינים
קשר מסוג יש-לוהאצלהמיקסינים פשוטיםהחלת כמה מיקסיניםמיקסינים לעומת ירושהסיכום – הרכבת רובוטתרגלו בעצמכם: קומפיילר Lua אונליין