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

سلاسل الوراثة

جزء من قسم البرمجة كائنية التوجّه في رحلة 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, Plane
Parse Error: Expected end of statement after superclass, found "," instead.

لا يدعم GDScript الوراثة المتعددة. عندما يحتاج صنف إلى ميزات صنفين، ضعهما في سلسلة واحدة، أو امنحه كائنًا من الصنف الآخر للعمل معه (يتناول فصل لاحق هذا الموضوع).

challenge icon

التحدي

سهل

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

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

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

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