Menu
CoddyTech

מאפיינים לקריאה בלבד

חלק מהיחידה תכנות מונחה עצמים במסלול ה-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 * length
var room := Room.new()
print(room.area) # 20
room.width = 6
print(room.area) # 30

צריך לעדכן var area רגיל באופן ידני בכל פעם ש-width או length משתנים, ועדכון אחד שנשכח משאיר אותו שגוי. הערך המחושב של area לא יכול להתיישן, ואי אפשר להציב בו ערך שגוי.

עבור ערך זהה בכל האובייקטים ואינו משתנה לעולם, השתמשו בקבוע במחלקה: const MAX_GUESTS = 4. ניסיון להשמה בקבוע מדווח לפני שהתוכנית מופעלת.

challenge icon

אתגר

קל

המחלקה 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])
quiz iconבחנו את עצמכם

השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.

כל השיעורים ביחידה תכנות מונחה עצמים

תרגלו בעצמכם: קומפיילר GDScript אונליין