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