Menu
Coddy logo textTech

האצלה

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

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

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

בקוד, פירוש הדבר הוא שהמחלקה Car מספקת מתודה פשוטה :start() שמעבירה את העבודה בפועל למנוע:

function Car:start()
    print("Turning the key...")
    self.engine:run()  -- האצל את הפעולה לאובייקט הפנימי
end

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

function Engine:run()
    print("Engine running at " .. self.horsepower .. " HP")
end

local engine = Engine:new(250)
local car = Car:new("Coupe", engine)
car:start()
-- פלט:
-- מסובבים את המפתח...
-- המנוע פועל בהספק של 250 HP

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

challenge icon

אתגר

קל

בואו נבנה מערכת נגן מוזיקה שמדגימה האצלה! תיצרו רכיב Speaker ו־MusicPlayer שמכיל אותו. הנגן לא יטפל ישירות בפלט הצליל, אלא יאציל את האחריות הזאת לרמקול הפנימי שלו.

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

  • Speaker.lua: צרו מחלקת Speaker עם בנאי :new(volume) ששומר את עוצמת הקול. הוסיפו מתודת :playSound(trackName) שמדפיסה: Playing "{trackName}" at volume {volume}
  • MusicPlayer.lua: צרו מחלקת MusicPlayer שהבנאי שלה :new(brand, speaker) מקבל שם מותג ואובייקט Speaker. הנגן שומר את הרמקול בתוכו. הוסיפו את המתודות הבאות:
    • :play(trackName): מדפיסה {brand} player starting... ואז מאצילה את הפעולה למתודת :playSound() של הרמקול
    • :stop(): מדפיסה {brand} player stopped
  • main.lua: חברו את הכול יחד! קראו את הקלטים של עוצמת הקול של הרמקול, מותג הנגן ושם של רצועה. צרו קודם Speaker, ואז העבירו אותו לבנאי של MusicPlayer. קראו למתודת :play() של הנגן עם שם הרצועה, ואז קראו ל־:stop().

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

  1. עוצמת הקול של הרמקול (מספר)
  2. מותג נגן המוזיקה (מחרוזת)
  3. שם הרצועה להשמעה (מחרוזת)

הפלט שלכם אמור להראות את הנגן מתאם את פעולתו עם הרמקול:

{brand} player starting...
Playing "{trackName}" at volume {volume}
{brand} player stopped

לדוגמה, אם הקלטים הם 75, SoundMax ו־Summer Vibes, הפלט אמור להיות:

SoundMax player starting...
Playing "Summer Vibes" at volume 75
SoundMax player stopped

שימו לב ש־MusicPlayer לא יודע איך להפיק צליל. הוא פשוט אומר לרמקול שלו לטפל בזה. זו האצלה בפעולה: האובייקט החיצוני מספק ממשק נקי, בעוד שהרכיב הפנימי מבצע את העבודה המיוחדת!

נסו בעצמכם

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

local Speaker = require('Speaker')
local MusicPlayer = require('MusicPlayer')

-- קראו את הקלטים
local volume = tonumber(io.read())
local brand = io.read()
local trackName = io.read()

-- TODO: צרו Speaker עם עוצמת הקול הנתונה

-- TODO: צרו MusicPlayer עם המותג והרמקול

-- TODO: קראו למתודה play של הנגן עם שם הרצועה

-- TODO: קראו למתודה stop של הנגן
quiz iconבחנו את עצמכם

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

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

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