Menu
CoddyTech

Kalıtım Zincirleri

Coddy'nin GDScript Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 18 / 65.

Bir alt sınıfın kendisi de bir üst sınıf olabilir. Her extends, kalıtım zincirine bir düzey ekler:

# 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'daki ve Vehicle'daki her şeye sahiptir. Her super() bir üst seviyeye çıkar, bu nedenle tek bir çağrı describe() işlevinin üç sürümünü de çalıştırır:

print(RaceCar.new(300).describe())
Car with 4 wheels, top speed 300

Bir yöntemi çağırdığınızda veya bir değişkeni okuduğunuzda Godot önce nesnenin kendi sınıfına, sonra üst sınıfına, ardından üst sınıfının üst sınıfına bakar ve bulduğu ilkini kullanır. RaceCar.new(300).wheels, iki seviye yukarıdaki Vehicle içinde bulunur.

Her sınıfın tam olarak bir üst sınıfı vardır. extends tek bir sınıf alır; iki sınıf listelemek bir ayrıştırma hatasına yol açar:

class_name FlyingCar
extends Car, Plane
Parse Error: Expected end of statement after superclass, found "," instead.

GDScript'te çoklu kalıtım yoktur. Bir sınıfın iki sınıfın özelliklerine ihtiyaç duyduğu durumlarda, bunları tek bir zincirde birleştirin veya çalışması için diğer sınıftan bir nesne verin (bunu daha sonraki bir bölüm ele alacak).

challenge icon

Görev

Kolay

character.gd, tamamlanmış Character sınıfını içerir: bir ad, hp, NAME (HP HP) döndüren describe() ve 1 döndüren attack(). Bunun üzerine iki seviye daha oluştur:

  • Warrior, Character sınıfından türetilir ve strength ekler. Yapıcısı, adı ve hp'yi super()'a iletir. describe(), üst sınıfın metnine , strength S ekler ve attack() strength değerini döndürür.
  • Knight, Warrior sınıfından türetilir ve armor ekler. Yapıcısı, adı, hp'yi ve strength değerini super()'a iletir. describe(), Warrior sınıfının metnine , armor A ekler ve attack(), Warrior sınıfının saldırı değerine 5 ekleyerek döndürür.

Sağlanan kod, ardından kaç karakter geleceğini okur ve her karakter için bir satır okur: character NAME HP, warrior NAME HP STRENGTH veya knight NAME HP STRENGTH ARMOR. describe() sonucunu ve saldırı değerini yazdırır. knight Arthur 120 15 8 için şu çıktıyı verir:

Arthur (120 HP), strength 15, armor 8
Attack: 20

Kodunu warrior.gd ve knight.gd dosyalarına yaz. main.gd, sağlanan girdi/çıktı kodunu içerir ve düzenlenemez.

Kendin dene

extends Node

func _ready():
	# Sağlanan girdi/çıktı kodu: olduğu gibi bırakın
	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 iconKendini test et

Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.

Nesne Yönelimli Programlama bölümündeki tüm dersler

Kendi başına pratik yap: Online GDScript derleyicisi