Menu
CoddyTech

Rantai Pewarisan

Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan GDScript di Coddy. Pelajaran 18 dari 65.

Class turunan dapat menjadi parent. Setiap extends menambahkan satu tingkat pada rantai pewarisan:

# 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 memiliki semua yang ada di Car dan Vehicle. Setiap super() naik satu tingkat, jadi satu pemanggilan menjalankan ketiga versi describe():

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

Saat kamu memanggil method atau membaca variabel, Godot mencari terlebih dahulu di class milik object itu sendiri, lalu di parent-nya, kemudian di parent dari parent tersebut, dan menggunakan yang pertama ditemukan. RaceCar.new(300).wheels ditemukan di Vehicle, dua tingkat di atas.

Setiap class memiliki tepat satu induk. extends menerima satu class, dan mencantumkan dua class akan menyebabkan error penguraian:

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

GDScript tidak mendukung pewarisan berganda. Jika sebuah class memerlukan fitur dari dua class, susun keduanya dalam satu rantai, atau berikan object dari class lainnya agar dapat digunakan (bab berikutnya membahas hal ini).

challenge icon

Tantangan

Mudah

character.gd berisi class Character yang sudah selesai: nama, hp, describe() yang mengembalikan NAME (HP HP), dan attack() yang mengembalikan 1. Buat dua tingkat lagi di atasnya:

  • Warrior mewarisi Character dan menambahkan strength. Konstruktor meneruskan nama dan hp ke super(). describe() menambahkan , strength S ke teks induknya, dan attack() mengembalikan strength.
  • Knight mewarisi Warrior dan menambahkan armor. Konstruktor meneruskan nama, hp, dan strength ke super(). describe() menambahkan , armor A ke teks Warrior, dan attack() mengembalikan attack milik Warrior ditambah 5.

Kode yang disediakan membaca jumlah karakter, lalu membaca satu baris untuk setiap karakter: character NAME HP, warrior NAME HP STRENGTH, atau knight NAME HP STRENGTH ARMOR. Kode tersebut mencetak describe() dan attack. Untuk knight Arthur 120 15 8, kode tersebut mencetak:

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

Tulis kodemu di warrior.gd dan knight.gd. main.gd berisi kode input/output yang disediakan dan tidak dapat diedit.

Coba sendiri

extends Node

func _ready():
	# Kode input/output yang disediakan: biarkan tetap seperti ini
	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 iconUji dirimu

Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.

Semua pelajaran di Pemrograman Berorientasi Objek

Latihan sendiri: Compiler GDScript online