Menu
Coddy logo textTech

אתחול מאפיינים

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

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

כך אפשר להרחיב את הבנאי כדי לקבל ערכים התחלתיים:

local Dog = {}
Dog.__index = Dog

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

function Dog:introduce()
    print("I am " .. self.name .. ", a " .. self.breed)
end

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

local dog1 = Dog:new("Rex", "German Shepherd")
local dog2 = Dog:new("Bella", "Poodle")

dog1:introduce()  -- פלט: אני Rex, רועה גרמני
dog2:introduce()  -- פלט: אני Bella, פודל

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

challenge icon

אתגר

קל

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

תיצרו:

  • Person.lua: הגדירו את מחלקת Person עם בנאי שמקבל שם וגיל. כללו מתודה :introduce() שמאפשרת לכל אדם להציג את עצמו.
  • main.lua: טענו את מודול Person וצרו מופע של אדם באמצעות הקלטים שסופקו. לאחר מכן, בקשו ממנו להציג את עצמו.

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

Hello, my name is [name] and I am [age] years old

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

  1. שם האדם
  2. גיל האדם

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

Hello, my name is Alice and I am 25 years old

נסו בעצמכם

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

-- קרא קלט
local name = io.read()
local age = io.read()

-- TODO: צור מופע חדש של Person באמצעות Person:new(name, age)

-- TODO: קרא למתודה introduce() במופע שלך של Person
quiz iconבחנו את עצמכם

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

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

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