Menu
Coddy logo textTech

משותף לעומת ייחודי

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

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

התייחסו להיררכיה הזאת:

local Animal = {}
Animal.__index = Animal
Animal.kingdom = "Animalia"  -- משותף: מוגדר במחלקה

function Animal:new(name)
    local obj = {name = name}  -- ייחודי: מאוחסן בכל מופע
    setmetatable(obj, Animal)
    return obj
end
local Dog = {}
Dog.__index = Dog
setmetatable(Dog, {__index = Animal})
Dog.sound = "bark"  -- משותף לכל ה-Dogs

function Dog:new(name, breed)
    local obj = Animal.new(Animal, name)
    obj.breed = breed  -- ייחודי: לכל Dog יש גזע משלו
    setmetatable(obj, Dog)
    return obj
end

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

local rex = Dog:new("Rex", "German Shepherd")

-- ייחודי למופע הזה (מאוחסן ב-rex)
print(rex.name)    -- "Rex"
print(rex.breed)   -- "German Shepherd"
-- משותף (נמצא באמצעות חיפוש)
print(rex.sound)   -- "bark" (מתוך Dog)
print(rex.kingdom) -- "Animalia" (מתוך Animal)

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

challenge icon

אתגר

קל

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

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

  • Creature.lua: הגדירו מחלקת אב עם מאפיין משותף ברמת המחלקה world = "Fantasy Realm" שכל היצורים חולקים. כללו בנאי :new(name) ששומר את שם היצור כמאפיין של המופע.
  • Dragon.lua: הגדירו מחלקת בת שיורשת מ-Creature. הוסיפו מאפיין משותף ברמת המחלקה element = "fire" שכל הדרקונים חולקים. הבנאי :new(name, color) צריך לקרוא לבנאי של מחלקת האב עבור השם, ואז להוסיף את color כמאפיין ייחודי של המופע עבור כל דרקון.
  • main.lua: צרו שני דרקונים שונים ובדקו את המאפיינים שלהם כדי להדגים את ההבדל בין נתונים משותפים לייחודיים.

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

  1. שם הדרקון הראשון וצבעו, מופרדים בפסיק (לדוגמה, Smaug,red)
  2. שם הדרקון השני וצבעו, מופרדים בפסיק (לדוגמה, Draco,gold)

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

  1. name של הדרקון הראשון
  2. color של הדרקון הראשון
  3. name של הדרקון השני
  4. color של הדרקון השני
  5. element של הדרקון הראשון (משותף ממחלקת Dragon)
  6. element של הדרקון השני (משותף ממחלקת Dragon)
  7. world של הדרקון הראשון (משותף ממחלקת Creature)

לדוגמה, אם הקלטים הם Smaug,red ו-Draco,gold, הפלט צריך להיות:

Smaug
red
Draco
gold
fire
fire
Fantasy Realm

שימו לב ש-name ו-color שונים עבור כל דרקון (מאפיינים ייחודיים של המופע), בעוד ש-element ו-world זהים עבור שניהם (מאפייני מחלקה משותפים שנמצאים דרך שרשרת החיפוש).

נסו בעצמכם

-- main.lua: צרו דרקונים והדגימו תכונות משותפות לעומת תכונות ייחודיות

local Dragon = require('Dragon')

-- קראו את הקלט עבור הדרקון הראשון (שם, צבע)
local input1 = io.read()
-- קראו את הקלט עבור הדרקון השני (שם, צבע)
local input2 = io.read()

-- TODO: נתחו את הקלט הראשון כדי לחלץ את השם והצבע
-- רמז: השתמשו ב-string.match עם התבנית "([^,]+),([^,]+)"

-- TODO: נתחו את הקלט השני כדי לחלץ את השם והצבע

-- TODO: צרו את הדרקון הראשון עם השם והצבע שלו

-- TODO: צרו את הדרקון השני עם השם והצבע שלו

-- TODO: הדפיסו את הפרטים הבאים לפי הסדר:
-- 1. השם של הדרקון הראשון
-- 2. הצבע של הדרקון הראשון
-- 3. השם של הדרקון השני
-- 4. הצבע של הדרקון השני
-- 5. היסוד של הדרקון הראשון (משותף למחלקה Dragon)
-- 6. היסוד של הדרקון השני (משותף למחלקה Dragon)
-- 7. העולם של הדרקון הראשון (משותף למחלקה Creature)
quiz iconבחנו את עצמכם

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

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

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