מאפיינים לקריאה בלבד
חלק מהיחידה תכנות מונחה עצמים במסלול ה-GDScript של Coddy. שיעור 29 מתוך 65.
ערכים מסוימים צריכים להיות ניתנים לקריאה מבחוץ, אך לעולם לא להיות מוקצים: מזהה שניתן פעם אחת כשהאובייקט נוצר, או ערך שמחושב מתוך נתונים אחרים, כמו שטח או סכום כולל. מאפיין עם בלוק get וללא בלוק set עושה זאת:
# ticket.gd
class_name Ticket
extends RefCounted
var _number: int
var number: int:
get:
return _number
func _init(start_number: int) -> void:
_number = start_numberהבנאי מאחסן את הערך ב־_number הפרטי, ו־number הציבורי רק מחזיר אותו. הקצאה ל־number מבחוץ אינה שגיאה, אבל היא לא משנה דבר, כי ה־getter ממשיך להחזיר את _number:
var ticket := Ticket.new(42)
ticket.number = 7
print(ticket.number) # 42למאפיין מחושב אין ערך משלו: פונקציית ה-get שלו מחשבת את הערך בכל פעם שקוראים אותו, ולכן הוא תמיד תואם לנתונים שמהם הוא נגזר:
# room.gd
class_name Room
extends RefCounted
var width: int = 4
var length: int = 5
var area: int:
get:
return width * lengthvar room := Room.new()
print(room.area) # 20
room.width = 6
print(room.area) # 30צריך לעדכן var area רגיל באופן ידני בכל פעם ש-width או length משתנים, ועדכון אחד שנשכח משאיר אותו שגוי. הערך המחושב של area לא יכול להתיישן, ואי אפשר להציב בו ערך שגוי.
עבור ערך זהה בכל האובייקטים ואינו משתנה לעולם, השתמשו בקבוע במחלקה: const MAX_GUESTS = 4. ניסיון להשמה בקבוע מדווח לפני שהתוכנית מופעלת.
אתגר
קלהמחלקה Order בקובץ order.gd שומרת את המזהה שלה ב-_id ואת הסכום של כל שורה ב-_line_totals (מחיר כפול כמות). הפכו את ארבעת המאפיינים הציבוריים שלה לקריאה בלבד באמצעות בלוקי get:
order_idמחזיר את_id.subtotalמחזיר את הסכום של_line_totals.shippingמחזיר0כאשר סכום הביניים הוא50או יותר, ואחרת5.totalמחזיר את סכום הביניים בתוספת עלות המשלוח.
הקוד שסופק קורא את מזהה ההזמנה, את מספר הפריטים, ולאחר מכן שורה אחת של price quantity עבור כל פריט. אחרי כל פריט הוא מדפיס את סכום הביניים, עלות המשלוח והסכום הכולל. בסוף הוא מנסה להגדיר את כל ארבעת המאפיינים ל-0, ואז מדפיס את המזהה ואת הסכום הכולל, שאמורים להישאר ללא שינוי. עבור המזהה 7 והפריטים 12 2 ו-30 1, הוא מדפיס:
Subtotal 24, shipping 5, total 29
Subtotal 54, shipping 0, total 54
Order #7: 54כתבו את הקוד שלכם ב-order.gd. הקובץ main.gd מכיל את קוד הקלט/פלט שסופק, ואי אפשר לערוך אותו.
נסו בעצמכם
extends Node
func _ready():
# קוד הקלט/פלט שסופק: יש להשאיר אותו כפי שהוא
var order := Order.new(int(OS.read_string_from_stdin()))
var count := int(OS.read_string_from_stdin())
for i in count:
var parts := OS.read_string_from_stdin().split(" ")
order.add_item(int(parts[0]), int(parts[1]))
print("Subtotal %d, shipping %d, total %d" % [order.subtotal, order.shipping, order.total])
# קוד שמנסה לדרוס את המאפיינים לקריאה בלבד
order.order_id = 0
order.subtotal = 0
order.shipping = 0
order.total = 0
print("Order #%d: %d" % [order.order_id, order.total])
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה תכנות מונחה עצמים
1יסודות התכנות מונחה העצמים
קבצים חיצונייםמבוא ל-OOPמחלקות לעומת אובייקטיםמילת המפתח selfמתודותמאפייניםבנאי (_init)חזרה – מחשבון פשוט2מאפייני מחלקה
משתני מופע לעומת משתנים סטטייםפונקציות סטטיותקובעי מאפייניםמאחזרי מאפייניםפרטיים לפי מוסכמהסיכום – מנהל חשבון בנק5כימוס
איברים ציבוריים ופרטייםאימות באמצעות Settersהסתרת מידעמאפיינים לקריאה בלבדסיכום – מערכת לניהול רשומות תלמידיםתרגלו בעצמכם: קומפיילר GDScript אונליין