Menu
CoddyTech

מילת המפתח 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 " + breed
var rex := Dog.new("Rex", "Husky")
print(rex.describe())
Animal created: Rex
Dog breed set: Husky
I am Rex, a Husky

כדי לקרוא למתודה אחרת של מחלקת האב, כתוב את שמה אחרי נקודה: super.describe() פועל מכל מתודה של Dog.

challenge icon

אתגר

קל

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

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

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

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