חיסור אובייקטים
חלק מהיחידה תכנות מונחה עצמים במסלול ה-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 אונליין