דריסת מתודות
חלק מהיחידה תכנות מונחה עצמים במסלול ה-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() של מחלקת הבת.
אתגר
קל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())
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה תכנות מונחה עצמים
1יסודות התכנות מונחה העצמים
קבצים חיצונייםמבוא ל-OOPמחלקות לעומת אובייקטיםמילת המפתח selfמתודותמאפייניםבנאי (_init)חזרה – מחשבון פשוט2מאפייני מחלקה
משתני מופע לעומת משתנים סטטייםפונקציות סטטיותקובעי מאפייניםמאחזרי מאפייניםפרטיים לפי מוסכמהסיכום – מנהל חשבון בנק5כימוס
איברים ציבוריים ופרטייםאימות באמצעות Settersהסתרת מידעמאפיינים לקריאה בלבדסיכום – מערכת לניהול רשומות תלמידיםתרגלו בעצמכם: קומפיילר GDScript אונליין