משתני מופע לעומת משתנים סטטיים
חלק מהיחידה תכנות מונחה עצמים במסלול ה-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 += 1var 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 עבור נתונים משותפים שמשתנים בזמן שהתוכנית פועלת, כמו מונה או הגדרה שכל האובייקטים פועלים לפיה.
אתגר
קלהשלימו את המחלקה 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())
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה תכנות מונחה עצמים
1יסודות התכנות מונחה העצמים
קבצים חיצונייםמבוא ל-OOPמחלקות לעומת אובייקטיםמילת המפתח selfמתודותמאפייניםבנאי (_init)חזרה – מחשבון פשוט2מאפייני מחלקה
משתני מופע לעומת משתנים סטטייםפונקציות סטטיותקובעי מאפייניםמאחזרי מאפייניםפרטיים לפי מוסכמהסיכום – מנהל חשבון בנק5כימוס
איברים ציבוריים ופרטייםאימות באמצעות Settersהסתרת מידעמאפיינים לקריאה בלבדסיכום – מערכת לניהול רשומות תלמידיםתרגלו בעצמכם: קומפיילר GDScript אונליין