الوراثة الأساسية
جزء من قسم البرمجة كائنية التوجّه في رحلة 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 إلى سطر import:
# 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أساسيات البرمجة كائنية التوجه
الملفات الخارجيةمقدمة إلى البرمجة كائنية التوجهالفئات مقابل الكائناتالكلمة المفتاحية selfالأساليبالخصائصالمُنشئ (_init)مراجعة - آلة حاسبة بسيطة4تعدد الأشكال
إعادة النظر في تجاوز الأساليبكتابة الأنواع بأسلوب البطةالفئات والأساليب المجرّدةتصميم الواجهاتمراجعة - حاسبة الأشكال10أنماط التصميم، الجزء الثاني
نمط الأوامرنمط المحوّلنمط المُزيّننمط الطريقة القالبيةنمط الحالةالنمط المركّب2خصائص الأصناف
متغيرات الكائن مقابل المتغيرات الساكنةالدوال الساكنةمُعيِّنات الخصائصمُسترجِعات الخصائصخاص وفقًا للاتفاقيةمراجعة - مدير الحسابات البنكية5التغليف
الأعضاء العامة والخاصةالتحقق من الصحة باستخدام دوال الضبطإخفاء المعلوماتالخصائص للقراءة فقطمراجعة - نظام سجلات الطلاب8مفاهيم متقدمة في البرمجة كائنية التوجه
التركيب مقابل الوراثةالأصناف الداخليةالعُقد كمكوّناتRefCounted مقابل Nodeالتعدادات في الأصنافتدرّب بنفسك: مترجم GDScript عبر الإنترنت