Thuộc tính chỉ đọc
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 29 trên 65.
Một số giá trị nên có thể đọc từ bên ngoài nhưng không bao giờ được gán: một ID chỉ được cấp một lần khi tạo đối tượng, hoặc một giá trị được tính từ dữ liệu khác, chẳng hạn như diện tích hay tổng. Thuộc tính có khối get nhưng không có khối set sẽ làm điều đó:
# ticket.gd
class_name Ticket
extends RefCounted
var _number: int
var number: int:
get:
return _number
func _init(start_number: int) -> void:
_number = start_numberHàm khởi tạo lưu giá trị trong _number riêng tư, còn number công khai chỉ trả về giá trị đó. Gán giá trị cho number từ bên ngoài không gây lỗi, nhưng cũng không thay đổi gì, vì getter vẫn trả về _number:
var ticket := Ticket.new(42)
ticket.number = 7
print(ticket.number) # 42Thuộc tính được tính toán không có giá trị riêng: getter của thuộc tính này tính toán giá trị mỗi khi được đọc, vì vậy giá trị luôn khớp với dữ liệu mà nó dựa vào:
# room.gd
class_name Room
extends RefCounted
var width: int = 4
var length: int = 5
var area: int:
get:
return width * lengthvar room := Room.new()
print(room.area) # 20
room.width = 6
print(room.area) # 30var area phải được cập nhật thủ công mỗi khi width hoặc length thay đổi, và chỉ cần quên cập nhật một lần là giá trị sẽ sai. area được tính toán nên luôn chính xác, và không ai có thể gán giá trị sai cho nó.
Với giá trị giống nhau ở mọi đối tượng và không bao giờ thay đổi, hãy dùng hằng số trong lớp: const MAX_GUESTS = 4. Việc gán giá trị cho hằng số sẽ được báo trước khi chương trình chạy.
Thử thách
DễLớp Order trong order.gd lưu ID trong _id và tổng tiền của từng dòng trong _line_totals (giá nhân với số lượng). Dùng các khối get để đặt bốn thuộc tính công khai ở chế độ chỉ đọc:
order_idtrả về_id.subtotaltrả về tổng các giá trị trong_line_totals.shippingtrả về0khi tổng phụ là50trở lên, nếu không thì trả về5.totaltrả về tổng phụ cộng với phí vận chuyển.
Code được cung cấp đọc ID đơn hàng, số lượng mặt hàng, rồi đọc một dòng price quantity cho mỗi mặt hàng. Sau mỗi mặt hàng, code in ra tổng phụ, phí vận chuyển và tổng cộng. Cuối cùng, code thử đặt cả bốn thuộc tính thành 0, rồi in ra ID và tổng cộng, vốn phải không đổi. Với ID 7 và các mặt hàng 12 2 và 30 1, code in ra:
Subtotal 24, shipping 5, total 29
Subtotal 54, shipping 0, total 54
Order #7: 54Viết code của bạn trong order.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 có sẵn: giữ nguyên
var order := Order.new(int(OS.read_string_from_stdin()))
var count := int(OS.read_string_from_stdin())
for i in count:
var parts := OS.read_string_from_stdin().split(" ")
order.add_item(int(parts[0]), int(parts[1]))
print("Subtotal %d, shipping %d, total %d" % [order.subtotal, order.shipping, order.total])
# Đoạn code cố ghi đè các thuộc tính chỉ đọc
order.order_id = 0
order.subtotal = 0
order.shipping = 0
order.total = 0
print("Order #%d: %d" % [order.order_id, order.total])
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