Menu
CoddyTech

משתני מופע לעומת משתנים סטטיים

חלק מהיחידה תכנות מונחה עצמים במסלול ה-GDScript של Coddy. שיעור 9 מתוך 65.

var רגיל במחלקה הוא משתנה מופע: לכל אובייקט יש משלו. static var שייך למחלקה במקום זאת: יש ערך אחד, המשותף לכל האובייקטים.

# student.gd
class_name Student
extends RefCounted

static var school: String = "Godot High"
static var count: int = 0
var student_name: String

func _init(new_name: String) -> void:
	student_name = new_name
	count += 1
var ada := Student.new("Ada")
var bo := Student.new("Bo")
print(Student.count) # 2
print(ada.student_name, " and ", bo.student_name) # Ada and Bo
Student.school = "Godot Academy"
print(ada.school) # Godot Academy
print(bo.school) # Godot Academy

קראו משתנה סטטי דרך שם המחלקה, כמו ב־Student.count, ואין צורך באובייקט. בתוך המחלקה, השתמשו בשמה: count += 1 בתוך _init() סופר את כל התלמידים שנוצרו עד כה.

שינוי של Student.school משנה אותו עבור כל התלמידים בבת אחת. ada.school = "Night School" היה עושה את אותו הדבר, כי יש רק school אחד; כתיבת שם המחלקה מבהירה זאת.

const משותף באותו אופן, אבל לעולם לא ניתן לשנות אותו. השתמשו ב־static var עבור נתונים משותפים שמשתנים בזמן שהתוכנית פועלת, כמו מונה או הגדרה שכל האובייקטים פועלים לפיה.

challenge icon

אתגר

קל

השלימו את המחלקה BankAccount בקובץ bank_account.gd:

  • משתנה int סטטי interest_percent שמתחיל ב־2, ומשותף לכל החשבונות
  • משתנה int סטטי account_count שמתחיל ב־0; הבנאי מוסיף לו 1 עבור כל חשבון חדש
  • הפונקציה describe() מחזירה HOLDER: $BALANCE at PERCENT%, תוך שימוש ב־holder וב־balance של החשבון וב־interest_percent המשותף

הקוד שסופק קורא כמה חשבונות מופיעים בהמשך, ואז שורה אחת של holder balance עבור כל אחד מהם, ולאחר מכן ריבית חדשה. הוא מדפיס את BankAccount.account_count ואת כל החשבונות, מגדיר את BankAccount.interest_percent לריבית החדשה, ומדפיס שוב את כל החשבונות. עבור Alice 1000, Bob 2000 והריבית 3, הוא מדפיס:

Accounts opened: 2
Alice: $1000 at 2%
Bob: $2000 at 2%
After the rate change:
Alice: $1000 at 3%
Bob: $2000 at 3%

הקוד שלכם ייכתב בקובץ bank_account.gd. הקובץ main.gd מכיל את קוד הקלט/פלט שסופק ואי אפשר לערוך אותו.

נסו בעצמכם

extends Node

func _ready():
	# קוד הקלט/פלט שסופק: יש להשאיר אותו כפי שהוא
	var accounts: Array[BankAccount] = []
	var count := int(OS.read_string_from_stdin())
	for i in count:
		var parts := OS.read_string_from_stdin().split(" ")
		accounts.append(BankAccount.new(parts[0], int(parts[1])))
	print("Accounts opened: %d" % BankAccount.account_count)
	for account in accounts:
		print(account.describe())
	BankAccount.interest_percent = int(OS.read_string_from_stdin())
	print("After the rate change:")
	for account in accounts:
		print(account.describe())
quiz iconבחנו את עצמכם

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

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

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