سلاسل الوراثة
جزء من قسم البرمجة كائنية التوجّه في رحلة GDScript على Coddy. الدرس 18 من 65.
يمكن للصنف الابن أن يكون أبًا بحد ذاته. كل extends تضيف مستوى واحدًا إلى سلسلة الوراثة:
# vehicle.gd
class_name Vehicle
extends RefCounted
var wheels: int
func _init(w: int) -> void:
wheels = w
func describe() -> String:
return "%d wheels" % wheels# car.gd
class_name Car
extends Vehicle
func _init() -> void:
super(4)
func describe() -> String:
return "Car with " + super()# race_car.gd
class_name RaceCar
extends Car
var top_speed: int
func _init(speed: int) -> void:
super()
top_speed = speed
func describe() -> String:
return super() + ", top speed %d" % top_speedيحتوي RaceCar على كل ما في Car وVehicle. ينتقل كل استدعاء لـsuper() إلى المستوى الأعلى، لذا يشغّل استدعاء واحد الإصدارات الثلاثة من describe():
print(RaceCar.new(300).describe())Car with 4 wheels, top speed 300عند استدعاء طريقة أو قراءة متغير، يبحث Godot أولًا في الصنف الخاص بالكائن، ثم في صنفه الأب، ثم في صنف الأب، ويستخدم أول ما يعثر عليه. يُعثر على RaceCar.new(300).wheels في Vehicle، على بُعد مستويين.
لكل صنف صنف أب واحد بالضبط. تأخذ extends صنفًا واحدًا، ويؤدي إدراج صنفين إلى خطأ في التحليل:
class_name FlyingCar
extends Car, PlaneParse Error: Expected end of statement after superclass, found "," instead.لا يدعم GDScript الوراثة المتعددة. عندما يحتاج صنف إلى ميزات صنفين، ضعهما في سلسلة واحدة، أو امنحه كائنًا من الصنف الآخر للعمل معه (يتناول فصل لاحق هذا الموضوع).
التحدي
سهليحتوي character.gd على الفئة المكتملة Character: اسم، وhp، وdescribe() التي تُرجع NAME (HP HP)، وattack() التي تُرجع 1. أضف إليها مستويين آخرين:
- ترث
WarriorمنCharacterوتضيفstrength. يمرر المُنشئ الاسم وhp إلىsuper(). تضيفdescribe()القيمة, strength Sإلى نص الفئة الأم، وتُرجعattack()قيمة القوة. - ترث
KnightمنWarriorوتضيفarmor. يمرر المُنشئ الاسم وhp والقوة إلىsuper(). تضيفdescribe()القيمة, armor Aإلى نصWarrior، وتُرجعattack()قيمة هجومWarriorمضافًا إليها5.
يقرأ الكود المُرفق عدد الشخصيات التي تليه، ثم سطرًا واحدًا لكل شخصية: character NAME HP أو warrior NAME HP STRENGTH أو knight NAME HP STRENGTH ARMOR. ويطبع describe() والهجوم. بالنسبة إلى knight Arthur 120 15 8، يطبع:
Arthur (120 HP), strength 15, armor 8
Attack: 20ضع الكود في warrior.gd وknight.gd. يحتوي main.gd على كود الإدخال/الإخراج المُرفق، ولا يمكن تعديله.
جرّب بنفسك
extends Node
func _ready():
# كود الإدخال/الإخراج المقدَّم: أبقِه كما هو
var count := int(OS.read_string_from_stdin())
for i in count:
var p := OS.read_string_from_stdin().split(" ")
var c: Character
if p[0] == "knight":
c = Knight.new(p[1], int(p[2]), int(p[3]), int(p[4]))
elif p[0] == "warrior":
c = Warrior.new(p[1], int(p[2]), int(p[3]))
else:
c = Character.new(p[1], int(p[2]))
print(c.describe())
print("Attack: %d" % c.attack())
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس البرمجة كائنية التوجّه
1أساسيات البرمجة كائنية التوجه
الملفات الخارجيةمقدمة إلى البرمجة كائنية التوجهالفئات مقابل الكائناتالكلمة المفتاحية selfالأساليبالخصائصالمُنشئ (_init)مراجعة - آلة حاسبة بسيطة4تعدد الأشكال
إعادة النظر في تجاوز الأساليبكتابة الأنواع بأسلوب البطةالفئات والأساليب المجرّدةتصميم الواجهاتمراجعة - حاسبة الأشكال10أنماط التصميم، الجزء الثاني
نمط الأوامرنمط المحوّلنمط المُزيّننمط الطريقة القالبيةنمط الحالةالنمط المركّب2خصائص الأصناف
متغيرات الكائن مقابل المتغيرات الساكنةالدوال الساكنةمُعيِّنات الخصائصمُسترجِعات الخصائصخاص وفقًا للاتفاقيةمراجعة - مدير الحسابات البنكية5التغليف
الأعضاء العامة والخاصةالتحقق من الصحة باستخدام دوال الضبطإخفاء المعلوماتالخصائص للقراءة فقطمراجعة - نظام سجلات الطلاب8مفاهيم متقدمة في البرمجة كائنية التوجه
التركيب مقابل الوراثةالأصناف الداخليةالعُقد كمكوّناتRefCounted مقابل Nodeالتعدادات في الأصنافتدرّب بنفسك: مترجم GDScript عبر الإنترنت