Menu
Coddy logo textTech

קשר מסוג יש-לו

חלק מהיחידה תכנות מונחה עצמים במסלול ה-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

המכונית לא יורשת מהמנוע. היא פשוט מחזיקה הפניה אליו. כך שתי המחלקות נשארות בלתי תלויות. אפשר להחליף אותו במנוע אחר, או להשתמש באותה מחלקת מנוע באופנוע.

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

challenge icon

אתגר

קל

בואו נבנה מערכת מחשב באמצעות הרכבה! במקום ירושה, תיצרו Computer שיש לו CPU בתוכו: כך תדגימו את הקשר ״יש לו״.

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

  • CPU.lua: צרו מחלקת CPU עם בנאי :new(brand, speed) ששומר את שם המותג ואת המהירות ב-GHz. כללו מתודת :getInfo() שמחזירה מחרוזת בפורמט: {brand} @ {speed}GHz
  • Computer.lua: צרו מחלקת Computer שהבנאי שלה :new(model, cpu) מקבל שם דגם ואובייקט CPU. ה-Computer שומר את אובייקט ה-CPU בתוכו (הרכבה!). כללו מתודת :describe() שמדפיסה את דגם המחשב ואת המידע של ה-CPU שלו.
  • main.lua: חברו את כל החלקים! קראו קלטים עבור מותג ה-CPU, מהירות ה-CPU ודגם המחשב. צרו תחילה אובייקט CPU, ואז העבירו אותו לבנאי של Computer. לבסוף, קראו למתודת :describe() של המחשב.

תקבלו שלושה קלטים:

  1. מותג ה-CPU (מחרוזת)
  2. מהירות ה-CPU ב-GHz (מספר)
  3. שם דגם המחשב (מחרוזת)

הפלט שלכם צריך להציג את תיאור המחשב, הכולל מידע מה-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() של המחשב כדי להדפיס את הפלט
quiz iconבחנו את עצמכם

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

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

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