מילת המפתח super
חלק מהיחידה תכנות מונחה עצמים במסלול ה-GDScript של Coddy. שיעור 16 מתוך 65.
כשילד זקוק לנתונים נוספים, הוא כותב _init() משלו. הבנאי של ההורה כבר לא מופעל מעצמו. קראו לו באמצעות super(), והעבירו את הארגומנטים שההורה מצפה להם:
# animal.gd
class_name Animal
extends RefCounted
var animal_name: String
func _init(n: String) -> void:
animal_name = n
print("Animal created: ", n)# dog.gd
class_name Dog
extends Animal
var breed: String
func _init(n: String, b: String) -> void:
super(n)
breed = b
print("Dog breed set: ", b)var buddy := Dog.new("Buddy", "Beagle")
print(buddy.animal_name, " the ", buddy.breed)Animal created: Buddy
Dog breed set: Beagle
Buddy the Beagleבלי השורה super(n), התוכנית עדיין פועלת, אבל הבנאי של Animal מדולג: שום דבר לא מגדיר את animal_name, ולכן הוא נשאר מחרוזת ריקה. הציבו את super() ראשונה, כדי שהמשתנים של המחלקה ההורה יהיו מוכנים לפני שהמחלקה היורשת משתמשת בהם.
בכל מתודה אחרת, super() מפעילה את הגרסה של המתודה שבה אתם נמצאים מתוך מחלקת האב. מחלקת הבת שומרת את התוצאה של מחלקת האב ומוסיפה עליה:
# animal.gd
func describe() -> String:
return "I am " + animal_name# dog.gd
func describe() -> String:
return super() + ", a " + breedvar rex := Dog.new("Rex", "Husky")
print(rex.describe())Animal created: Rex
Dog breed set: Husky
I am Rex, a Huskyכדי לקרוא למתודה אחרת של מחלקת האב, כתוב את שמה אחרי נקודה: super.describe() פועל מכל מתודה של Dog.
אתגר
קלכתבו מחלקה Person ומחלקה Employee שיורשת ממנה.
Personמאחסנת אתperson_nameואתageבבנאי שלה.introduce()מחזירהHi, I'm NAME and I'm AGE years old.Employeeמוסיפה אתjob. הבנאי שלה מעביר את השם ואת הגיל אלsuper()ומאחסן את התפקיד.introduce()שלה מחזירה את התוצאה שלintroduce()של מחלקת האב, ואחריה. I work as a JOB.
הקוד שסופק קורא כמה אנשים מופיעים, ואז שורה אחת לכל אדם: person NAME AGE או employee NAME AGE JOB. הוא מדפיס את introduce() עבור כל אחד מהם. עבור person Alice 30 ועבור employee Bob 35 Developer הוא מדפיס:
Hi, I'm Alice and I'm 30 years old
Hi, I'm Bob and I'm 35 years old. I work as a Developerהקוד שלכם ייכתב בקבצים person.gd ו-employee.gd. הקובץ main.gd מכיל את קוד הקלט/פלט שסופק ואי אפשר לערוך אותו.
נסו בעצמכם
extends Node
func _ready():
# קוד הקלט/פלט שסופק: יש להשאיר אותו כפי שהוא
var count := int(OS.read_string_from_stdin())
for i in count:
var parts := OS.read_string_from_stdin().split(" ")
if parts[0] == "employee":
var employee := Employee.new(parts[1], int(parts[2]), parts[3])
print(employee.introduce())
else:
var person := Person.new(parts[1], int(parts[2]))
print(person.introduce())
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה תכנות מונחה עצמים
1יסודות התכנות מונחה העצמים
קבצים חיצונייםמבוא ל-OOPמחלקות לעומת אובייקטיםמילת המפתח selfמתודותמאפייניםבנאי (_init)חזרה – מחשבון פשוט2מאפייני מחלקה
משתני מופע לעומת משתנים סטטייםפונקציות סטטיותקובעי מאפייניםמאחזרי מאפייניםפרטיים לפי מוסכמהסיכום – מנהל חשבון בנק5כימוס
איברים ציבוריים ופרטייםאימות באמצעות Settersהסתרת מידעמאפיינים לקריאה בלבדסיכום – מערכת לניהול רשומות תלמידיםתרגלו בעצמכם: קומפיילר GDScript אונליין