חיסור אובייקטים
חלק מהיחידה תכנות מונחה עצמים במסלול ה-Lua של Coddy. שיעור 27 מתוך 70.
בדומה לכך ש־__add מטפלת באופרטור +, מתודת המטא __sub מגדירה התנהגות עבור האופרטור -. התבנית זהה. מגדירים פונקציה שמקבלת שני אופרנדים ומחזירה אובייקט חדש.
local Color = {}
Color.__index = Color
function Color:new(r, g, b)
local obj = {r = r, g = g, b = b}
setmetatable(obj, Color)
return obj
end
function Color.__sub(c1, c2)
return Color:new(c1.r - c2.r, c1.g - c2.g, c1.b - c2.b)
endבעבודה עם צבעי RGB, חיסור יכול להפיק ערכים שליליים. ביישומים אמיתיים, ייתכן שתרצו להגביל את התוצאות לטווחים תקינים (0-255), אבל המבנה הבסיסי של מתודות מטא נשאר זהה.
local bright = Color:new(200, 150, 100)
local dim = Color:new(50, 30, 20)
local result = bright - dim
print(result.r, result.g, result.b) -- פלט: 150 120 80זכרו: הגדירו את __sub עם נקודה (ולא עם נקודתיים), מכיוון שזו מתודת מטא ש-Lua קוראת לה ישירות עם שני האופרנדים כארגומנטים.
אתגר
קלבואו נבנה מחלקה Color שתומכת בחיסור באמצעות האופרטור -. צבעים מיוצגים על ידי ערכי RGB, וחיסור של צבע אחד מצבע אחר יוצר צבע חדש, שבו כל רכיב הוא ההפרש בין הרכיבים המתאימים.
תארגן את הקוד שלך בשני קבצים:
Color.lua: הגדירו את המחלקה Color עם הרכיביםr,gו-b, המייצגים את ערכי האדום, הירוק והכחול. כללו בנאי:new(r, g, b)וממשו את המתודה המטא-טבלאית__sub, כך שחיסור של שני צבעים ייצור צבע חדש עם ההפרשים בין הרכיבים המתאימים. זכרו ש-__subמשתמשת בתחביר נקודה ומקבלת את שני האופרנדים כארגומנטים.main.lua: טענו את המודול Color, צרו מופעי צבע מתוך הקלטים שסופקו, החסירו ביניהם והציגו את ערכי ה-RGB של התוצאה.
תקבלו שישה קלטים:
- רכיב האדום של הצבע הראשון
- רכיב הירוק של הצבע הראשון
- רכיב הכחול של הצבע הראשון
- רכיב האדום של הצבע השני
- רכיב הירוק של הצבע השני
- רכיב הכחול של הצבע השני
בקובץ הראשי, צרו שני צבעים עם ערכי ה-RGB הנתונים, החסירו את הצבע השני מהראשון באמצעות האופרטור -, והדפיסו את ערכי r, g ו-b של הצבע שהתקבל, כל אחד בשורה נפרדת.
לדוגמה, אם הקלטים הם 200, 150, 100, 50, 30, 20, הפלט צריך להיות:
150
120
80הצבע הראשון (200, 150, 100) פחות הצבע השני (50, 30, 20) שווה לצבע חדש (150, 120, 80).
נסו בעצמכם
-- טען את המודול Color באמצעות require
local Color = require('Color')
-- קרא את ערכי הקלט
local r1 = tonumber(io.read())
local g1 = tonumber(io.read())
local b1 = tonumber(io.read())
local r2 = tonumber(io.read())
local g2 = tonumber(io.read())
local b2 = tonumber(io.read())
-- TODO: צור שני מופעים של Color עם ערכי ה-RGB הנתונים
-- TODO: החסר את הצבע השני מהראשון באמצעות האופרטור -
-- TODO: הדפס את ערכי r, g ו-b של הצבע שהתקבל, כל אחד בשורה נפרדת
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה תכנות מונחה עצמים
4פרויקט: בנק דיגיטלי
הגדרת הפרויקטפעולת הפקדה7פולימורפיזם ודריסת מתודות
דריסת מתודותקריאה למתודות של מחלקת האבטיפוסיות ברווזממשק משותףבדיקת טיפוססיכום – תפקידי עובדים2תבנית אב־טיפוס למחלקה
מושג אב־הטיפוסקישור באמצעות __indexהבנאי :new()אתחול מאפייניםמופעים עצמאייםסיכום – מפעל מכוניות5העמסת אופרטורים בתכנות מונחה עצמים
חיבור אובייקטיםחיסור אובייקטיםשרשור אובייקטיםהשוואת אובייקטים (<, >)חזרה – חישובים עם ארנק8כימוס
כללי מתן שמותClosures לשמירה על פרטיותגישה באמצעות Closuresטבלאות לקריאה בלבדלוגיקת אימותסיכום – כספת מאובטחת11תבניות עיצוב (בקצרה)
פונקציות Factoryטבלת Singletonתבנית IteratorObserver (מאזין)סיכום – מפעל Logger3מצב והתנהגות של אובייקטים
משתני מופעמתודות Getterמתודות Setterמאפיינים מחושביםעיצוב מחרוזותבדיקות שוויוןסיכום – ציון תלמיד6יסודות הירושה
הכנת מבנה הירושהירושת מתודותהרחבת הבנאיהוספת מתודות למחלקת הבתמשותף לעומת ייחודיסיכום – היררכיית צורותתרגלו בעצמכם: קומפיילר Lua אונליין