Menu
CoddyTech
flag Ar iconالعربيةdown icon

إعادة تعريف الأساليب

جزء من قسم البرمجة كائنية التوجّه في رحلة 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() الخاص بالفئة الابنة.

challenge icon

التحدي

سهل

يحتوي 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())
quiz iconاختبر نفسك

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

جميع دروس البرمجة كائنية التوجّه

تدرّب بنفسك: مترجم GDScript عبر الإنترنت