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