Menu
CoddyTech

Phương thức thiết lập thuộc tính

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

Một thuộc tính có thể chạy code mỗi khi được gán. Đặt dấu hai chấm sau phần khai báo và thêm một khối set(value): thụt lề, đó là setter:

# player.gd
var health: int = 100:
	set(value):
		health = clampi(value, 0, 100)

value là giá trị đang được gán. Bên trong setter, việc gán health sẽ lưu giá trị vào thuộc tính, chứ không chạy lại setter. Setter này giữ health trong khoảng từ 0 đến 100, bất kể phần còn lại của chương trình gán giá trị nào:

var p := Player.new()
p.health -= 30
print(p.health) # 70
p.health = 250
print(p.health) # 100
p.health -= 500
print(p.health) # 0

Setter chạy mỗi khi có phép gán, kể cả bên trong lớp: health -= 10 trong một phương thức của Player và health = start_health trong _init() đều đi qua setter. Chỉ giá trị ban đầu sau = trong phần khai báo mới được lưu mà không gọi setter.

Phương thức thiết lập cũng có thể từ chối một giá trị. Nếu nó không gán giá trị cho thuộc tính, giá trị cũ vẫn giữ nguyên:

var level: int = 1:
	set(value):
		if value > level:
			level = value

Bỏ kiểu dữ liệu khỏi value: set(value: int): là lỗi. Kiểu dữ liệu của thuộc tính đã cho biết nó chứa gì.

challenge icon

Thử thách

Dễ

Thêm setter cho thuộc tính health của lớp Player trong player.gd để:

  • giữ giá trị health được lưu trong khoảng từ 0 đến max_health: nếu giá trị lớn hơn thì lưu thành max_health, nếu là số âm thì lưu thành 0
  • in ra Player is down! khi health mới bằng 0 và health cũ lớn hơn 0

Code được cung cấp sẽ đọc số lượng lệnh tiếp theo, rồi đọc từng lệnh trên một dòng: damage N (player.health -= N), heal N (player.health += N) hoặc set N (player.health = N). Sau mỗi lệnh, chương trình sẽ in ra health. Với damage 30, heal 50, damage 120 và heal 10, chương trình sẽ in ra:

Health: 70
Health: 100
Player is down!
Health: 0
Health: 10

Code của bạn nằm trong player.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 player := Player.new()
	var count := int(OS.read_string_from_stdin())
	for i in count:
		var parts := OS.read_string_from_stdin().split(" ")
		var amount := int(parts[1])
		if parts[0] == "damage":
			player.health -= amount
		elif parts[0] == "heal":
			player.health += amount
		elif parts[0] == "set":
			player.health = amount
		print("Health: %d" % player.health)
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