Menu
CoddyTech

דריסת מתודות

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

מחלקת צאצא דורסת מתודה על ידי הגדרת מתודה בעלת אותו שם. אובייקטים של מחלקת הצאצא מריצים אז את הגרסה של מחלקת הצאצא, והמתודות שהיא אינה דורסת עדיין עוברות בירושה ללא שינוי.

# animal.gd
class_name Animal
extends RefCounted

var animal_name: String

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

func make_sound() -> void:
	print("Some generic animal sound")

func info() -> void:
	print("I am ", animal_name)
# dog.gd
class_name Dog
extends Animal

func make_sound() -> void:
	print("Woof! Woof!")
var animal := Animal.new("Generic")
var dog := Dog.new("Buddy")
animal.make_sound()
dog.make_sound()
dog.info()
Some generic animal sound
Woof! Woof!
I am Buddy

הדריסה חייבת לשמור על החתימה של המחלקה האב: אותם פרמטרים ואותו סוג החזרה. אם היא שונה, התוכנית לא מתחילה:

# animal.gd
func speak(times: int) -> String:
	return "...".repeat(times)
# dog.gd
func speak() -> String:
	return "Woof"
Parse Error: The function signature doesn't match the parent. Parent signature is "speak(int) -> String".

הגרסה של הילד פועלת גם כשהקריאה מגיעה ממתודה של ההורה. כאן introduce() קיימת רק ב־Animal, והיא קוראת ל־sound(), שעליה Cat עושה דריסה:

# animal.gd
func sound() -> String:
	return "..."

func introduce() -> String:
	return animal_name + " says " + sound()
# cat.gd
func sound() -> String:
	return "Meow"
print(Cat.new("Tom").introduce())
Tom says Meow

אי אפשר לדרוס משתנים: הכרזה שוב על var animal_name בתוך Dog היא שגיאת ניתוח (The member "animal_name" already exists in parent class Animal). כדי לתת למחלקת הבת ערך התחלתי אחר, יש להציב אותו ב-_init() של מחלקת הבת.

challenge icon

אתגר

קל

shape.gd מכיל את המחלקה המוגמרת Shape: יש לה color, את area() שמחזירה 0.0 ואת describe(). המחלקות Circle ו-Square יורשות ממנה וכבר כוללות את הבנאים שלהן. יש לדרוס שתי מתודות בכל אחת מהן:

  • Circle: המתודה area() מחזירה את PI * radius * radius, והמתודה describe() מחזירה את This is a COLOR circle with radius R.
  • Square: המתודה area() מחזירה את side * side, והמתודה describe() מחזירה את This is a COLOR square with side S.

יש לשמור על החתימות של המחלקה האב: func area() -> float ו-func describe() -> String.

הקוד שסופק קורא כמה צורות מופיעות, ואז שורה אחת לכל צורה: shape COLOR, circle COLOR RADIUS או square COLOR SIDE. הוא מדפיס את describe() ואת השטח עם שתי ספרות אחרי הנקודה העשרונית. עבור circle red 5 ו-shape green הוא מדפיס:

This is a red circle with radius 5
Area: 78.54
This is a green shape
Area: 0.00

יש לכתוב את הקוד שלך בקבצים circle.gd ו-square.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(" ")
		var shape: Shape
		if parts[0] == "circle":
			shape = Circle.new(parts[1], int(parts[2]))
		elif parts[0] == "square":
			shape = Square.new(parts[1], int(parts[2]))
		else:
			shape = Shape.new(parts[1])
		print(shape.describe())
		print("Area: %.2f" % shape.area())
quiz iconבחנו את עצמכם

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

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

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