Enum במחלקות
חלק מהיחידה תכנות מונחה עצמים במסלול ה-GDScript של Coddy. שיעור 44 מתוך 65.
אפשר להכריז על enum בתוך מחלקה, לצד המשתנים שלה. האפשרויות שייכות אז למחלקה הזאת:
# weapon.gd
class_name Weapon
extends RefCounted
enum Kind { SWORD, BOW, STAFF }
var kind: Kind
func _init(weapon_kind: Kind) -> void:
kind = weapon_kind
func is_ranged() -> bool:
return kind == Kind.BOW or kind == Kind.STAFFבתוך weapon.gd נמצא ה-enum בשם Kind. בכל קובץ אחר כותבים קודם את שם המחלקה, Weapon.Kind.BOW, בערכים, בהערות טיפוס ובתבניות match:
# blacksmith.gd
class_name Blacksmith
extends RefCounted
static func repair_cost(kind: Weapon.Kind) -> int:
match kind:
Weapon.Kind.SWORD:
return 20
Weapon.Kind.BOW:
return 15
return 30האפשרויות הן עדיין מספרים: Weapon.new(Weapon.Kind.BOW).kind מדפיס 1. ה-enum עצמו פועל כמו מילון שממפה שמות למספרים:
print(Weapon.Kind.keys()) # ["SWORD", "BOW", "STAFF"]
print(Weapon.Kind.find_key(1)) # BOW
print(Weapon.Kind["STAFF"]) # 2
print(Weapon.Kind.size()) # 3
for kind in Weapon.Kind.values():
print(Weapon.Kind.find_key(kind), ": ", Blacksmith.repair_cost(kind))הלולאה מדפיסה SWORD: 20, BOW: 15 ו-STAFF: 30. GDScript לא בודק שמספר הוא אחת מהאפשרויות: Weapon.new(7) יוצר נשק שה-kind שלו הוא 7. העבר את האפשרויות בשם, והקוד יישאר תקין.
טיפוס enum שמתאר מחלקה מסוימת שייך בתוך אותה מחלקה, כך שהקורא יראה מאין מגיע Kind בתוך Weapon.Kind.BOW.
אתגר
קלמיינ/י שיקויים באמצעות enum שמוגדר במחלקה Potion.
- ב־
potion.gd, יש להצהיר עלenum Kind { HEAL, MANA, POISON }ולהגדיר את הטיפוס שלkindבתורKind. Potion.from_text(text, strength)היא פונקציה סטטית שהופכת את"MANA"ל־Kind.MANAומחזירה שיקוי חדש.describe()מחזירהHEAL potion: +20 HP,MANA potion: +15 MPאוPOISON potion: -5 HP, תוך שימוש בשם הסוג ובעוצמה.- ב־
belt.gd, הפונקציהsummary()מחזירה שורה אחת לכל סוג, לפי הסדר של ה־enum:HEAL: 2 (35 total), עם מספר השיקויים מאותו סוג, ובסוגריים — סכום העוצמות שלהם. גם לסוגים שאין להם שיקויים תופיע שורה.
הקוד שסופק קורא כמה שיקויים מופיעים בהמשך (HEAL 20), מוסיף כל אחד לחגורה, מדפיס את התיאור שלו ואז את הסיכום. עבור HEAL 20, POISON 5, HEAL 15 יודפס:
Added HEAL potion: +20 HP
Added POISON potion: -5 HP
Added HEAL potion: +15 HP
HEAL: 2 (35 total)
MANA: 0 (0 total)
POISON: 1 (5 total)יש לכתוב את הקוד שלך ב־potion.gd וב־belt.gd. הקובץ main.gd מכיל את קוד הקלט/פלט שסופק, ואי אפשר לערוך אותו.
נסו בעצמכם
extends Node
func _ready():
# קוד הקלט/פלט שסופק: יש להשאיר אותו כפי שהוא
var belt := Belt.new()
var count := int(OS.read_string_from_stdin())
for i in count:
var parts := OS.read_string_from_stdin().split(" ")
var potion := Potion.from_text(parts[0], int(parts[1]))
belt.add(potion)
print("Added ", potion.describe())
for line in belt.summary():
print(line)
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה תכנות מונחה עצמים
1יסודות התכנות מונחה העצמים
קבצים חיצונייםמבוא ל-OOPמחלקות לעומת אובייקטיםמילת המפתח selfמתודותמאפייניםבנאי (_init)חזרה – מחשבון פשוט2מאפייני מחלקה
משתני מופע לעומת משתנים סטטייםפונקציות סטטיותקובעי מאפייניםמאחזרי מאפייניםפרטיים לפי מוסכמהסיכום – מנהל חשבון בנק5כימוס
איברים ציבוריים ופרטייםאימות באמצעות Settersהסתרת מידעמאפיינים לקריאה בלבדסיכום – מערכת לניהול רשומות תלמידים8מושגי OOP מתקדמים
קומפוזיציה לעומת ירושהמחלקות פנימיותצמתים כרכיביםRefCounted לעומת NodeEnum במחלקותתרגלו בעצמכם: קומפיילר GDScript אונליין