Menu
CoddyTech

איברים ציבוריים ופרטיים

חלק מהיחידה תכנות מונחה עצמים במסלול ה-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 קוראת להן עבורך, לכן לעולם אל תיתן לאחת מהמתודות הפרטיות שלך את אותו השם.

challenge icon

אתגר

קל

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

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

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

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