Phương thức _to_string
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 32 trên 65.
In ra một đối tượng có lớp không định nghĩa _to_string() chỉ hiển thị lớp và một ID nội bộ, thay đổi sau mỗi lần chạy: <RefCounted#-9223372009541466673>. Hãy định nghĩa _to_string() và trả về văn bản cần hiển thị thay thế:
# card.gd
class_name Card
extends RefCounted
var rank: String
var suit: String
func _init(new_rank: String, new_suit: String) -> void:
rank = new_rank
suit = new_suit
func _to_string() -> String:
return rank + " of " + suitGodot gọi phương thức này mỗi khi biến đối tượng thành văn bản: khi dùng print(), str(), %s trong chuỗi định dạng và với từng đối tượng bên trong một Array hoặc Dictionary được in ra:
var card := Card.new("Queen", "hearts")
print(card) # Đầm cơ
print(str(card)) # Đầm cơ
print("You drew %s" % card) # Bạn rút được quân đầm cơ
print([card, Card.new("7", "clubs")]) # [Đầm cơ, 7 chuồn]"You drew " + card vẫn gây lỗi, vì + nối hai chuỗi (string) còn card là một đối tượng. Hãy chuyển đổi nó trước: "You drew " + str(card).
Lớp con có thể ghi đè _to_string() và dùng văn bản của lớp cha với super():
# wild_card.gd
class_name WildCard
extends Card
func _to_string() -> String:
return "Wild " + super()print(WildCard.new("King", "spades")) in ra Wild King of spades.
_to_string() trả về văn bản và bản thân nó không in ra gì cả. Code sử dụng đối tượng sẽ quyết định văn bản được in ra, nối vào một dòng dài hơn hay lưu lại.
Thử thách
DễThêm phương thức _to_string() cho hai lớp:
PlayingCardtrongplaying_card.gdcóranktừ2đến14và mộtsuit. Nội dung dạng văn bản gồm thứ hạng,ofvà chất bài, chẳng hạn như7 of clubs. Các thứ hạng11,12,13và14được viết làJ,Q,KvàA:Q of hearts.Handtronghand.gdlưu các lá bài trong_cards. Nội dung dạng văn bản làHand (N):theo sau là nội dung của các lá bài được nối bằng,, hoặcHand (0): emptynếu không có lá bài nào.
Code được cung cấp in ra bộ bài trống, đọc số lượng lá bài, rồi đọc một dòng RANK SUIT cho mỗi lá bài. Code thêm từng lá bài vào bộ bài, in ra Drew và lá bài đó, rồi cuối cùng in ra bộ bài. Với các lá bài 7 clubs và 12 hearts, chương trình in ra:
Hand (0): empty
Drew 7 of clubs
Drew Q of hearts
Hand (2): 7 of clubs, Q of heartsCode của bạn nằm trong playing_card.gd và hand.gd. main.gd chứa code đầu vào/đầu ra được cung cấp và không thể chỉnh sửa.
Tự làm thử
extends Node
func _ready():
# Đoạn code đầu vào/đầu ra đã cho: giữ nguyên
var hand := Hand.new()
print(hand)
var count := int(OS.read_string_from_stdin())
for i in count:
var parts := OS.read_string_from_stdin().split(" ")
var card := PlayingCard.new(int(parts[0]), parts[1])
hand.add(card)
print("Drew %s" % card)
print(hand)
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ớp3Kế thừa
Kế thừa cơ bảnTừ khóa superGhi đè phương thứcChuỗi kế thừaKiểm tra kiểu bằng isTổng kết: phân cấp nhân viên6Phương thức đặc biệt
Giới thiệu về phương thức ảoPhương thức _to_stringTrình lặp tùy chỉnhÔn tập: danh sách tùy chỉnhTự luyện tập: Trình biên dịch GDScript online