Menu
CoddyTech

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_number

Hà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) # 42

Thuộ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 * length
var room := Room.new()
print(room.area) # 20
room.width = 6
print(room.area) # 30

var 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.

challenge icon

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_id trả về _id.
  • subtotal trả về tổng các giá trị trong _line_totals.
  • shipping trả về 0 khi tổng phụ là 50 trở lên, nếu không thì trả về 5.
  • total trả 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: 54

Viế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])
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