Menu
Coddy logo textTech

הבנאי :new()

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

יצירת אובייקטים ידנית, הכנת טבלה ריקה, הגדרת מטא־טבלה עבורה וקישור __index — כל אלה הופכים לחזרתיים. הפתרון המקובל הוא להגדיר ישירות במחלקה מתודת בנאי :new() שמטפלת בכל אלה עבורך.

הנה התבנית:

local Dog = {}
Dog.__index = Dog

function Dog:new()
    local instance = {}
    setmetatable(instance, self)
    return instance
end

function Dog:bark()
    print("Woof!")
end

נפרק את מה שקורה בתוך :new(). תחילה, יוצרים טבלה ריקה בשם instance. לאחר מכן מגדירים את המטא־טבלה שלה ל־self, שהוא Dog כשקוראים ל־Dog:new().

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

שימו לב לשורה Dog.__index = Dog מחוץ לבנאי. זהו קיצור דרך נפוץ: במקום ליצור מטא-טבלה נפרדת, טבלת המחלקה משמשת גם כאבטיפוס וגם כמטא-טבלה.

כעת יצירת אובייקטים נקייה ועקבית:

local myDog = Dog:new()
myDog:bark()  -- פלט: Woof!

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

challenge icon

אתגר

קל

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

תיצור:

  • Cat.lua: הגדר את מחלקת Cat שלך עם תבנית הבנאי המלאה. המחלקה שלך צריכה לכלול:
    • טבלת מחלקה שבה __index מצביע לעצמה
    • בנאי :new() שיוצר מופע, מגדיר את המטא־טבלה שלו ומחזיר אותו
    • שיטה :meow() שמדפיסה את הצליל של החתול
    החזר את טבלת המחלקה בסוף הקובץ.
  • main.lua: טען את מודול Cat שלך והשתמש בבנאי כדי ליצור מופע של חתול. לאחר מכן קרא לשיטה שלו כדי לוודא שהכול מקושר כראוי.

תקבל קלט אחד: מספר הפעמים שהחתול שלך אמור למיאו.

השיטה :meow() שלך צריכה להדפיס בדיוק:

Meow!

בקובץ הראשי שלך, צור חתול באמצעות Cat:new() וקרא ל־:meow() את מספר הפעמים שצוין.

לדוגמה, אם הקלט הוא 3, הפלט צריך להיות:

Meow!
Meow!
Meow!

נסו בעצמכם

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

-- קרא קלט: מספר הפעמים ליילל
local times = tonumber(io.read())

-- TODO: צור מופע של חתול באמצעות Cat:new()

-- TODO: קרא למתודה :meow() את מספר הפעמים שצוין
quiz iconבחנו את עצמכם

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

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

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