משותף לעומת ייחודי
חלק מהיחידה תכנות מונחה עצמים במסלול ה-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
endlocal 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 בבנאים ייחודיים לכל מופע, ואילו שדות שמוגדרים ישירות בטבלאות מחלקה משותפים לכל המופעים של אותה מחלקה ושל מחלקות הבת שלה.
אתגר
קלנחקור כיצד נתונים עוברים דרך היררכיית הורשה באמצעות בניית מערכת מחלקות Creature ו-Dragon. תראו בעצמכם אילו מאפיינים משותפים לכל המופעים ואילו ייחודיים לכל אובייקט בנפרד.
תארגנו את הקוד בשלושה קבצים:
Creature.lua: הגדירו מחלקת אב עם מאפיין משותף ברמת המחלקהworld = "Fantasy Realm"שכל היצורים חולקים. כללו בנאי:new(name)ששומר את שם היצור כמאפיין של המופע.Dragon.lua: הגדירו מחלקת בת שיורשת מ-Creature. הוסיפו מאפיין משותף ברמת המחלקהelement = "fire"שכל הדרקונים חולקים. הבנאי:new(name, color)צריך לקרוא לבנאי של מחלקת האב עבור השם, ואז להוסיף אתcolorכמאפיין ייחודי של המופע עבור כל דרקון.main.lua: צרו שני דרקונים שונים ובדקו את המאפיינים שלהם כדי להדגים את ההבדל בין נתונים משותפים לייחודיים.
תקבלו שתי קלטים:
- שם הדרקון הראשון וצבעו, מופרדים בפסיק (לדוגמה,
Smaug,red) - שם הדרקון השני וצבעו, מופרדים בפסיק (לדוגמה,
Draco,gold)
בקובץ הראשי, צרו את שני הדרקונים עם שמותיהם וצבעיהם המתאימים. לאחר מכן הדפיסו את המידע הבא בסדר המדויק הזה:
nameשל הדרקון הראשוןcolorשל הדרקון הראשוןnameשל הדרקון השניcolorשל הדרקון השניelementשל הדרקון הראשון (משותף ממחלקת Dragon)elementשל הדרקון השני (משותף ממחלקת Dragon)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)
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה תכנות מונחה עצמים
4פרויקט: בנק דיגיטלי
הגדרת הפרויקטפעולת הפקדה7פולימורפיזם ודריסת מתודות
דריסת מתודותקריאה למתודות של מחלקת האבטיפוסיות ברווזממשק משותףבדיקת טיפוססיכום – תפקידי עובדים2תבנית אב־טיפוס למחלקה
מושג אב־הטיפוסקישור באמצעות __indexהבנאי :new()אתחול מאפייניםמופעים עצמאייםסיכום – מפעל מכוניות5העמסת אופרטורים בתכנות מונחה עצמים
חיבור אובייקטיםחיסור אובייקטיםשרשור אובייקטיםהשוואת אובייקטים (<, >)חזרה – חישובים עם ארנק8כימוס
כללי מתן שמותClosures לשמירה על פרטיותגישה באמצעות Closuresטבלאות לקריאה בלבדלוגיקת אימותסיכום – כספת מאובטחת11תבניות עיצוב (בקצרה)
פונקציות Factoryטבלת Singletonתבנית IteratorObserver (מאזין)סיכום – מפעל Logger3מצב והתנהגות של אובייקטים
משתני מופעמתודות Getterמתודות Setterמאפיינים מחושביםעיצוב מחרוזותבדיקות שוויוןסיכום – ציון תלמיד6יסודות הירושה
הכנת מבנה הירושהירושת מתודותהרחבת הבנאיהוספת מתודות למחלקת הבתמשותף לעומת ייחודיסיכום – היררכיית צורותתרגלו בעצמכם: קומפיילר Lua אונליין