Menu
CoddyTech

Chuỗi kế thừa

Thuộc phần Lập trình hướng đối tượng trong hành trình GDScript của Coddy. Bài học 18 trên 65.

Một lớp con cũng có thể là lớp cha. Mỗi lần dùng extends sẽ thêm một cấp vào chuỗi kế thừa:

# 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 có mọi thứ từ Car và Vehicle. Mỗi lần gọi super() sẽ lên một cấp, nên một lần gọi chạy cả ba phiên bản của describe():

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

Khi bạn gọi một phương thức hoặc đọc một biến, Godot tìm trong lớp của đối tượng trước, rồi đến lớp cha, sau đó đến lớp cha của lớp cha và dùng mục đầu tiên tìm thấy. RaceCar.new(300).wheels nằm trong Vehicle, ở lớp cha cách hai cấp.

Mỗi lớp chỉ có đúng một lớp cha. extends nhận một lớp duy nhất, nếu liệt kê hai lớp sẽ gây lỗi phân tích cú pháp:

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

GDScript không hỗ trợ kế thừa đa lớp. Khi một lớp cần các tính năng của hai lớp, hãy xếp chúng thành một chuỗi kế thừa hoặc cung cấp cho lớp đó một đối tượng thuộc lớp còn lại để làm việc cùng (một chương sau sẽ đề cập đến cách này).

challenge icon

Thử thách

Dễ

character.gd chứa lớp Character đã hoàn thiện: một tên, hp, describe() trả về NAME (HP HP) và attack() trả về 1. Hãy xây dựng thêm hai cấp kế thừa:

  • Warrior kế thừa Character và bổ sung strength. Hàm khởi tạo truyền tên và hp cho super(). describe() thêm , strength S vào văn bản của lớp cha, còn attack() trả về strength.
  • Knight kế thừa Warrior và bổ sung armor. Hàm khởi tạo truyền tên, hp và strength cho super(). describe() thêm , armor A vào văn bản của Warrior, còn attack() trả về giá trị attack của Warrior cộng với 5.

Code được cung cấp đọc số lượng nhân vật tiếp theo, rồi đọc một dòng cho mỗi nhân vật: character NAME HP, warrior NAME HP STRENGTH hoặc knight NAME HP STRENGTH ARMOR. Code in ra describe() và đòn tấn công. Với knight Arthur 120 15 8, chương trình in ra:

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

Viết code trong warrior.gd và knight.gd. main.gd chứa code đầu vào/đầu ra được cung cấp và bạn không thể chỉnh sửa tệp này.

Tự làm thử

extends Node

func _ready():
	# Đoạn code đầu vào/đầu ra đã có sẵn: giữ nguyê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 iconTự kiểm tra

Bài học này có một bài trắc nghiệm ngắn. Bắt đầu bài học để trả lời và theo dõi tiến độ.

Tất cả bài học trong Lập trình hướng đối tượng

Tự luyện tập: Trình biên dịch GDScript online