Menu
Coddy logo textTech

מופעים עצמאיים

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

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

נבחן את הדוגמה הזאת:

local Counter = {}
Counter.__index = Counter

function Counter:new(start)
    local instance = {}
    setmetatable(instance, self)
    instance.value = start or 0
    return instance
end

function Counter:increment()
    self.value = self.value + 1
end

-- צור שני מונים נפרדים
local counterA = Counter:new(10)
local counterB = Counter:new(5)

counterA:increment()
counterA:increment()

print(counterA.value)  -- פלט: 12
print(counterB.value)  -- פלט: 5

אף על פי ששני המונים מגיעים מאותה מחלקת Counter, הגדלת counterA אינה משפיעה על counterB. לכל אובייקט יש שדה value משלו, המאוחסן בטבלת המופע שלו.

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

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

challenge icon

אתגר

קל

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

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

  • Wallet.lua: הגדירו את מחלקת Wallet שלכם באמצעות תבנית הבנאי המקובלת. כל ארנק צריך לעקוב אחר היתרה של עצמו, balance. כללו:
    • בנאי :new(startingBalance) שמאתחל את הארנק בסכום הנתון
    • מתודה :add(amount) שמגדילה את היתרה
    • מתודה :spend(amount) שמקטינה את היתרה
  • main.lua: יבאו את מודול Wallet וצרו שני מופעים נפרדים של ארנק. בצעו פעולות שונות על כל אחד מהם כדי להראות שהם שומרים על מצב עצמאי.

תקבלו ארבעה קלטים:

  1. היתרה ההתחלתית של ארנק A
  2. היתרה ההתחלתית של ארנק B
  3. הסכום שיש להוסיף לארנק A
  4. הסכום שיש להוציא מארנק B

בקובץ הראשי:

  1. צרו את walletA עם היתרה ההתחלתית הראשונה
  2. צרו את walletB עם היתרה ההתחלתית השנייה
  3. הוסיפו את הסכום הנתון ל-walletA
  4. הוציאו את הסכום הנתון מ-walletB
  5. הדפיסו את שתי היתרות בשורות נפרדות

הדפיסו את היתרות הסופיות בפורמט המדויק הבא:

Wallet A: [balance]
Wallet B: [balance]

לדוגמה, אם הקלטים הם 100, 50, 25 ו-10, הפלט צריך להיות:

Wallet A: 125
Wallet B: 40

שימו לב שהוספה לארנק A לא משנה את ארנק B, והוצאה מארנק B לא משפיעה על ארנק A: כל מופע שומר על יתרה נפרדת משלו.

נסו בעצמכם

-- טען את המודול Wallet
local Wallet = require('Wallet')

-- קרא את הקלטים
local startingA = tonumber(io.read())
local startingB = tonumber(io.read())
local addAmount = tonumber(io.read())
local spendAmount = tonumber(io.read())

-- TODO: צור את walletA עם היתרה ההתחלתית הראשונה

-- TODO: צור את walletB עם היתרה ההתחלתית השנייה

-- TODO: הוסף את הסכום שצוין ל-walletA

-- TODO: הוצא את הסכום שצוין מ-walletB

-- TODO: הדפס את היתרות הסופיות בפורמט הנדרש
-- פורמט: "Wallet A: [balance]" ו-"Wallet B: [balance]"
quiz iconבחנו את עצמכם

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

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

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