Kế thừa cơ bản
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 15 trên 65.
Kế thừa cho phép một lớp sử dụng các biến và phương thức của lớp khác. Lớp truyền chúng đi gọi là lớp cha, còn lớp nhận chúng gọi là lớp con.
Đây là một lớp cha trong tệp riêng:
# animal.gd
class_name Animal
extends RefCounted
var animal_name: String
func _init(n: String) -> void:
animal_name = n
func info() -> void:
print("I am ", animal_name, ", an animal")Lớp con khai báo lớp cha sau extends. class_name của lớp cha có phạm vi toàn cục, nên dog.gd không cần dòng import:
# dog.gd
class_name Dog
extends AnimalDog này không có code riêng, nhưng vẫn có animal_name, info() và hàm khởi tạo của Animal:
var creature := Animal.new("Creature")
var buddy := Dog.new("Buddy")
creature.info()
buddy.info()I am Creature, an animal
I am Buddy, an animalLớp con có thể thêm các phương thức riêng bên cạnh những phương thức được kế thừa. Bên trong các phương thức đó, những biến được kế thừa hoạt động như thể lớp con đã khai báo chúng:
# dog.gd
class_name Dog
extends Animal
func bark() -> void:
print(animal_name, " says Woof!")var buddy := Dog.new("Buddy")
buddy.info()
buddy.bark()I am Buddy, an animal
Buddy says Woof!Tính kế thừa chỉ đi theo một chiều. Animal không nhận được những gì Dog bổ sung, vì vậy gọi bark() trên một đối tượng Animal sẽ gây ra lỗi.
Các lớp (class) bạn đã viết cho đến nay đều có câu lệnh extends RefCounted: chúng là lớp con của RefCounted, một lớp có sẵn trong Godot.
Thử thách
DễTạo một lớp cha và một lớp con.
- Trong
vehicle.gd, khai báo choVehiclehai biến String làbrandvàmodel. Hàm khởi tạo lưu hai đối số vào các biến này, còninfo()trả vềVehicle: BRAND MODEL. car.gdđã có câu lệnhextends Vehicle. Viết phương thứchonk()để trả vềBRAND MODEL says Beep beep!, sử dụng các biến màCarkế thừa.
Car không cần hàm khởi tạo: Car.new("Honda", "Civic") dùng hàm khởi tạo từ Vehicle.
Code được cung cấp đọc số lượng phương tiện tiếp theo, rồi đọc mỗi phương tiện trên một dòng: vehicle hoặc car, một nhãn hiệu và một mẫu xe. Code in ra info() cho mỗi phương tiện và cả honk() cho xe hơi. Với vehicle Toyota Corolla và car Honda Civic, chương trình in ra:
Vehicle: Toyota Corolla
Vehicle: Honda Civic
Honda Civic says Beep beep!Đặt code của bạn trong vehicle.gd và car.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 đã cho: 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] == "car":
var car := Car.new(parts[1], parts[2])
print(car.info())
print(car.honk())
else:
var vehicle := Vehicle.new(parts[1], parts[2])
print(vehicle.info())
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
1Nền tảng về OOP
Tệp bên ngoàiGiới thiệu về OOPLớp và đối tượngTừ khóa selfPhương thứcThuộc tínhHàm khởi tạo (_init)Ôn tập: máy tính đơn giản4Tính đa hình
Xem lại cách ghi đè phương thứcĐịnh kiểu vịtLớp và phương thức trừu tượngThiết kế interfaceÔn tập: máy tính hình học7Tín hiệu
Tín hiệu là gì?Khai báo và phát tín hiệuKết nối với tín hiệuTín hiệu có đối sốÔn tập: hệ thống sức khỏe10Các mẫu thiết kế phần 2
Mẫu lệnhMẫu bộ chuyển đổiMẫu trang tríMẫu phương thức khuôn mẫuMẫu trạng tháiMẫu tổng hợp2Thuộc tính của lớp
Biến instance và biến staticHàm staticPhương thức thiết lập thuộc tínhPhương thức lấy thuộc tínhQuy ước về tính riêng tưÔn tập: trình quản lý tài khoản ngân hàng5Tính đóng gói
Thành viên công khai và riêng tưXác thực bằng phương thức setterẨn thông tinThuộc tính chỉ đọcÔn tập: hệ thống hồ sơ học sinh8Khái niệm OOP nâng cao
Kết hợp và kế thừaLớp bên trongNode dưới dạng thành phầnRefCounted và NodeEnum trong lớpTự luyện tập: Trình biên dịch GDScript online