Menu
CoddyTech

Từ khóa super

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 16 trên 65.

Khi một lớp con cần thêm dữ liệu, nó tự viết hàm _init() của mình. Khi đó, hàm khởi tạo của lớp cha sẽ không còn tự chạy nữa. Hãy gọi hàm đó bằng super(), đồng thời truyền các tham số mà lớp cha mong đợi:

# animal.gd
class_name Animal
extends RefCounted

var animal_name: String

func _init(n: String) -> void:
	animal_name = n
	print("Animal created: ", n)
# dog.gd
class_name Dog
extends Animal

var breed: String

func _init(n: String, b: String) -> void:
	super(n)
	breed = b
	print("Dog breed set: ", b)
var buddy := Dog.new("Buddy", "Beagle")
print(buddy.animal_name, " the ", buddy.breed)
Animal created: Buddy
Dog breed set: Beagle
Buddy the Beagle

Không có dòng super(n), chương trình vẫn chạy, nhưng hàm khởi tạo của Animal bị bỏ qua: không có gì thiết lập animal_name, nên biến này vẫn là một chuỗi rỗng. Đặt super() lên đầu tiên để các biến của lớp cha sẵn sàng trước khi lớp con sử dụng chúng.

Trong bất kỳ phương thức nào khác, super() chạy phiên bản của phương thức mà bạn đang ở trong lớp cha. Lớp con giữ lại kết quả của lớp cha và bổ sung thêm:

# animal.gd
func describe() -> String:
	return "I am " + animal_name
# dog.gd
func describe() -> String:
	return super() + ", a " + breed
var rex := Dog.new("Rex", "Husky")
print(rex.describe())
Animal created: Rex
Dog breed set: Husky
I am Rex, a Husky

Để gọi một phương thức khác của lớp cha, hãy viết tên phương thức đó sau dấu chấm: super.describe() có thể dùng trong bất kỳ phương thức nào của Dog.

challenge icon

Thử thách

Dễ

Viết lớp Person và lớp Employee kế thừa lớp đó.

  • Person lưu person_name và age trong hàm khởi tạo. introduce() trả về Hi, I'm NAME and I'm AGE years old.
  • Employee bổ sung job. Hàm khởi tạo của lớp này truyền tên và tuổi vào super(), rồi lưu công việc. introduce() trả về kết quả của introduce() từ lớp cha, theo sau là . I work as a JOB.

Code được cung cấp đọc số người tiếp theo, rồi đọc một dòng cho mỗi người: person NAME AGE hoặc employee NAME AGE JOB. Code in ra introduce() cho từng người. Với person Alice 30 và employee Bob 35 Developer, kết quả in ra là:

Hi, I'm Alice and I'm 30 years old
Hi, I'm Bob and I'm 35 years old. I work as a Developer

Đặt code của bạn trong person.gd và employee.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 parts := OS.read_string_from_stdin().split(" ")
		if parts[0] == "employee":
			var employee := Employee.new(parts[1], int(parts[2]), parts[3])
			print(employee.introduce())
		else:
			var person := Person.new(parts[1], int(parts[2]))
			print(person.introduce())
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