איברים ציבוריים ופרטיים
חלק מהיחידה תכנות מונחה עצמים במסלול ה-GDScript של Coddy. שיעור 26 מתוך 65.
כימוס פירושו שאובייקט שומר את הנתונים שלו יחד עם המתודות שמשנות אותם, וקובע באילו מהחברים שלו קוד אחר רשאי להשתמש. החברים המיועדים לשימוש של קוד אחר יוצרים את הממשק של האובייקט.
ל-GDScript אין מילות מפתח מסוג public או private: אפשר לגשת לכל איבר מבחוץ. מדריך הסגנון של Godot מסמן את האיברים הפרטיים באמצעות קו תחתון בתחילת השם:
# bank_account.gd
class_name BankAccount
extends RefCounted
var owner_name: String
var _balance: int = 0
var _history: Array[String] = []
func _init(holder: String) -> void:
owner_name = holder
func deposit(amount: int) -> void:
_balance += amount
_record("deposit %d" % amount)
func get_balance() -> int:
return _balance
func _record(entry: String) -> void:
_history.append(entry)owner_name, deposit() ו־get_balance() ציבוריים, ולכן main.gd משתמש בהם. _balance, _history ו־_record() פרטיים: רק הקוד שבתוך bank_account.gd משתמש בהם.
# main.gd
var account := BankAccount.new("Ada")
account.deposit(50)
account.deposit(20)
print(account.owner_name) # Ada
print(account.get_balance()) # 70הקו התחתון הוא מוסכמה, לא מנעול: account._balance = 1000000 בקובץ main.gd רץ ללא שגיאה. בכל זאת, היצמדו למוסכמה. כשרק המחלקה משנה את _balance, יתרה שגויה יכולה לנבוע רק ממתודה בקובץ bank_account.gd, ולכן זה הקובץ היחיד שעליכם לבדוק.
גם ל-GDScript אין רמת protected. מחלקת משנה יורשת כל איבר, כולל איברים פרטיים, ולכן SavingsAccount ש-extends BankAccount יכולה להשתמש ב-_balance בשיטות שלה.
גם מתודות וירטואליות של Godot, כמו _init() ו-_ready(), מתחילות בקו תחתון. Godot קוראת להן עבורך, לכן לעולם אל תיתן לאחת מהמתודות הפרטיות שלך את אותו השם.
אתגר
קלהשלימו את המחלקה Hero בקובץ hero.gd. האיברים הציבוריים שלה הם hero_name, gain_xp(), get_xp() ו-get_level(). שאר האיברים פרטיים:
- הוסיפו את המשתנים הפרטיים
_xp(מתחיל ב-0) ו-_level(מתחיל ב-1). - הוסיפו את המתודה הפרטית
_update_level(), שמגדירה את_levelל-1 + _xp / 100(חלוקה במספרים שלמים). gain_xp(amount)מוסיפה אתamountל-_xp, קוראת ל-_update_level()ומחזירהtrueכשהרמה עלתה, ו-falseאחרת.get_xp()ו-get_level()מחזירות את הערכים הפרטיים.
הקוד שסופק קורא את שם הגיבור, לאחר מכן את מספר כמויות ה-XP שמופיעות בהמשך, ואז כמות אחת בכל שורה. אחרי כל כמות הוא מדפיס שורה של Level up! כאשר gain_xp() מחזירה true, ואז את מצב הגיבור. עבור Ada והכמויות 40, 70 ו-250 יודפס:
Ada: 40 XP, level 1
Level up! Ada is now level 2
Ada: 110 XP, level 2
Level up! Ada is now level 4
Ada: 360 XP, level 4הקוד שלכם ייכתב בקובץ hero.gd. הקובץ main.gd מכיל את קוד הקלט/פלט שסופק, ואי אפשר לערוך אותו.
נסו בעצמכם
extends Node
func _ready():
# קוד הקלט/פלט שסופק: השאירו אותו כפי שהוא
var hero := Hero.new(OS.read_string_from_stdin())
var count := int(OS.read_string_from_stdin())
for i in count:
var amount := int(OS.read_string_from_stdin())
if hero.gain_xp(amount):
print("Level up! %s is now level %d" % [hero.hero_name, hero.get_level()])
print("%s: %d XP, level %d" % [hero.hero_name, hero.get_xp(), hero.get_level()])
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה תכנות מונחה עצמים
1יסודות התכנות מונחה העצמים
קבצים חיצונייםמבוא ל-OOPמחלקות לעומת אובייקטיםמילת המפתח selfמתודותמאפייניםבנאי (_init)חזרה – מחשבון פשוט2מאפייני מחלקה
משתני מופע לעומת משתנים סטטייםפונקציות סטטיותקובעי מאפייניםמאחזרי מאפייניםפרטיים לפי מוסכמהסיכום – מנהל חשבון בנק5כימוס
איברים ציבוריים ופרטייםאימות באמצעות Settersהסתרת מידעמאפיינים לקריאה בלבדסיכום – מערכת לניהול רשומות תלמידיםתרגלו בעצמכם: קומפיילר GDScript אונליין