חיבור אובייקטים
חלק מהיחידה תכנות מונחה עצמים במסלול ה-Lua של Coddy. שיעור 26 מתוך 70.
כבר ראית איך מטא־מתודות כמו __tostring ו־__eq מאפשרות לך להתאים אישית את אופן ההתנהגות של אובייקטים. עכשיו נרחיב זאת לפעולות חשבון, החל בחיבור.
מתודת המטא __add מגדירה מה קורה כשמשתמשים באופרטור + בין שני אובייקטים. כש-Lua נתקל ב-a + b, הוא מחפש את __add במטא־טבלה של אחד מהאופרנדים.
local Vector = {}
Vector.__index = Vector
function Vector:new(x, y)
local obj = {x = x, y = y}
setmetatable(obj, Vector)
return obj
end
function Vector.__add(v1, v2)
return Vector:new(v1.x + v2.x, v1.y + v2.y)
endשימו לב ש-__add מוגדרת עם נקודה, ולא עם נקודתיים. היא מקבלת את שני האופרנדים כארגומנטים, ואמורה להחזיר אובייקט חדש במקום לשנות אחד מהמקוריים. כך הפעולה נשארת צפויה ובטוחה.
local a = Vector:new(3, 4)
local b = Vector:new(1, 2)
local c = a + b
print(c.x, c.y) -- פלט: 4 6התובנה המרכזית היא ש-__add חייב להיות במטא-טבלה עצמה (כאן, Vector), ולא רק באובייקט. מכיוון שהגדרנו את Vector כמטא-טבלה של כל המופעים, כולם חולקים את ההתנהגות הזאת באופן אוטומטי.
אתגר
קלבואו נבנה מחלקה Vector שתומכת בחיבור באמצעות האופרטור +. זהו הצעד הראשון שלך בדרך להעמסת אופרטורים, שמאפשרת לאובייקטים שלך לפעול באופן טבעי עם האופרטורים המובנים של Lua.
תארגן את הקוד שלך בשני קבצים:
Vector.lua: הגדר את המחלקה Vector שלך עם רכיביxו-y. כלול בנאי:new(x, y)וממש את המטאמַתודה__addכך שחיבור של שני וקטורים ייצור וקטור חדש עם הרכיבים המשולבים. זכור ש-__addמשתמש בתחביר נקודה (ולא נקודתיים) ומקבל את שני האופרנדים כארגומנטים.main.lua: טען את מודול Vector שלך, צור מופעים של וקטורים והדגם שחיבור שלהם מפיק את התוצאה הנכונה.
תקבל ארבעה קלטים:
- רכיב x של הווקטור הראשון
- רכיב y של הווקטור הראשון
- רכיב x של הווקטור השני
- רכיב y של הווקטור השני
בקובץ הראשי שלך, צור שני וקטורים עם הרכיבים הנתונים, חבר אותם באמצעות האופרטור +, והדפס את ערכי x ו-y של הווקטור שנוצר, כל אחד בשורה נפרדת.
לדוגמה, אם הקלטים הם 3, 4, 1, 2, הפלט צריך להיות:
4
6הווקטור הראשון (3, 4) ועוד הווקטור השני (1, 2) שווים לווקטור חדש (4, 6).
נסו בעצמכם
-- טען את המודול Vector באמצעות require
local Vector = require('Vector')
-- קרא את הקלט
local x1 = tonumber(io.read())
local y1 = tonumber(io.read())
local x2 = tonumber(io.read())
local y2 = tonumber(io.read())
-- TODO: צור שני מופעים של Vector באמצעות ערכי הקלט
-- TODO: חבר את שני הווקטורים באמצעות האופרטור +
-- TODO: הדפס את ערכי x ו-y של הווקטור שהתקבל בשורות נפרדות
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה תכנות מונחה עצמים
4פרויקט: בנק דיגיטלי
הגדרת הפרויקטפעולת הפקדה7פולימורפיזם ודריסת מתודות
דריסת מתודותקריאה למתודות של מחלקת האבטיפוסיות ברווזממשק משותףבדיקת טיפוססיכום – תפקידי עובדים2תבנית אב־טיפוס למחלקה
מושג אב־הטיפוסקישור באמצעות __indexהבנאי :new()אתחול מאפייניםמופעים עצמאייםסיכום – מפעל מכוניות5העמסת אופרטורים בתכנות מונחה עצמים
חיבור אובייקטיםחיסור אובייקטיםשרשור אובייקטיםהשוואת אובייקטים (<, >)חזרה – חישובים עם ארנק8כימוס
כללי מתן שמותClosures לשמירה על פרטיותגישה באמצעות Closuresטבלאות לקריאה בלבדלוגיקת אימותסיכום – כספת מאובטחת11תבניות עיצוב (בקצרה)
פונקציות Factoryטבלת Singletonתבנית IteratorObserver (מאזין)סיכום – מפעל Logger3מצב והתנהגות של אובייקטים
משתני מופעמתודות Getterמתודות Setterמאפיינים מחושביםעיצוב מחרוזותבדיקות שוויוןסיכום – ציון תלמיד6יסודות הירושה
הכנת מבנה הירושהירושת מתודותהרחבת הבנאיהוספת מתודות למחלקת הבתמשותף לעומת ייחודיסיכום – היררכיית צורותתרגלו בעצמכם: קומפיילר Lua אונליין