חיבור אובייקטים
חלק מהיחידה תכנות מונחה עצמים במסלול ה-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 מוגדרת באמצעות נקודה. Lua מעבירה את שני האופרנדים כארגומנטים רגילים, וצורת הנקודה מעניקה לשניהם שמות. גם נקודתיים יעבדו, מכיוון ש־function Vector:__add(other) זהה ל־function Vector.__add(self, other), אבל צורת הנקודה היא המקובלת. __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
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 אונליין