Menu
CoddyTech

ירושה בסיסית

חלק מהיחידה תכנות מונחה עצמים במסלול ה-GDScript של Coddy. שיעור 15 מתוך 65.

הורשה מאפשרת למחלקה אחת לרשת את המשתנים והמתודות של מחלקה אחרת. המחלקה שמעבירה אותם נקראת מחלקת־אב, והמחלקה שמקבלת אותם נקראת מחלקת־בת.

הנה מחלקת אב בקובץ משלה:

# animal.gd
class_name Animal
extends RefCounted

var animal_name: String

func _init(n: String) -> void:
	animal_name = n

func info() -> void:
	print("I am ", animal_name, ", an animal")

מחלקת צאצא מציינת את מחלקת האב שלה אחרי extends. ה־class_name של מחלקת האב הוא גלובלי, לכן dog.gd לא זקוק לשורת ייבוא:

# dog.gd
class_name Dog
extends Animal

ל-Dog הזה אין קוד משלו, ובכל זאת יש לו את animal_name, את info() ואת הבנאי של Animal:

var creature := Animal.new("Creature")
var buddy := Dog.new("Buddy")
creature.info()
buddy.info()
I am Creature, an animal
I am Buddy, an animal

ילד יכול להוסיף שיטות משלו לצד השיטות שעברו בירושה. בתוכן, המשתנים שעברו בירושה פועלים כאילו הילד הכריז עליהם:

# dog.gd
class_name Dog
extends Animal

func bark() -> void:
	print(animal_name, " says Woof!")
var buddy := Dog.new("Buddy")
buddy.info()
buddy.bark()
I am Buddy, an animal
Buddy says Woof!

ירושה פועלת בכיוון אחד. Animal לא מקבל את מה ש־Dog מוסיף, ולכן קריאה ל־bark() על אובייקט Animal היא שגיאה.

המחלקות שכתבת עד כה ציינו extends RefCounted: הן היו מחלקות-בת של RefCounted, מחלקה מובנית ב-Godot.

challenge icon

אתגר

קל

בנו מחלקת אב ומחלקת בת.

  • ב־vehicle.gd, הגדירו ל־Vehicle שני משתני String, brand ו־model. הבנאי שומר בהם את שני הארגומנטים שלו, ו־info() מחזירה Vehicle: BRAND MODEL.
  • ב־car.gd כבר כתוב extends Vehicle. כתבו את המתודה שלו honk(): היא מחזירה BRAND MODEL says Beep beep!, באמצעות המשתנים ש־Car יורשת.

אין צורך בבנאי עבור Car: הקריאה Car.new("Honda", "Civic") משתמשת בבנאי של Vehicle.

הקוד שסופק קורא כמה כלי רכב מופיעים בהמשך, ולאחר מכן שורה אחת לכל כלי רכב: vehicle או car, מותג ודגם. הוא מדפיס את info() עבור כל כלי רכב, וגם את honk() עבור מכונית. עבור vehicle Toyota Corolla ו־car Honda Civic, הוא מדפיס:

Vehicle: Toyota Corolla
Vehicle: Honda Civic
Honda Civic says Beep beep!

כתבו את הקוד שלכם ב־vehicle.gd וב־car.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] == "car":
			var car := Car.new(parts[1], parts[2])
			print(car.info())
			print(car.honk())
		else:
			var vehicle := Vehicle.new(parts[1], parts[2])
			print(vehicle.info())
quiz iconבחנו את עצמכם

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

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

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