Setter property
Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan GDScript di Coddy. Pelajaran 11 dari 65.
Sebuah property dapat menjalankan kode setiap kali diberi nilai. Letakkan titik dua setelah deklarasi dan tambahkan blok set(value): dengan indentasi, yaitu setter-nya:
# player.gd
var health: int = 100:
set(value):
health = clampi(value, 0, 100)value adalah nilai yang ditetapkan. Di dalam setter, menetapkan health akan menyimpan nilai ke dalam property; tindakan ini tidak menjalankan setter lagi. Setter ini menjaga health tetap di antara 0 dan 100, apa pun yang ditetapkan oleh bagian lain program:
var p := Player.new()
p.health -= 30
print(p.health) # 70
p.health = 250
print(p.health) # 100
p.health -= 500
print(p.health) # 0Setter dijalankan setiap kali ada penugasan, termasuk di dalam class: health -= 10 dalam method Player dan health = start_health dalam _init() sama-sama melewatinya. Hanya nilai awal setelah = dalam deklarasi yang disimpan tanpa memanggilnya.
Sebuah setter juga dapat menolak nilai. Jika setter tidak menetapkan property, nilai lama akan tetap ada:
var level: int = 1:
set(value):
if value > level:
level = valueHilangkan tipe dari value: set(value: int): adalah error. Tipe property itu sendiri sudah menyatakan nilai yang disimpannya.
Tantangan
MudahBeri property health dari class Player di player.gd sebuah setter yang:
- menjaga health yang disimpan tetap di antara
0danmax_health: nilai yang lebih besar disimpan sebagaimax_healthdan nilai negatif disimpan sebagai0 - mencetak
Player is down!ketika health baru bernilai0dan health lama lebih dari0
Kode yang disediakan membaca jumlah perintah berikutnya, lalu satu per baris: damage N (player.health -= N), heal N (player.health += N) atau set N (player.health = N). Setelah setiap perintah, kode mencetak health. Untuk damage 30, heal 50, damage 120 dan heal 10, kode mencetak:
Health: 70
Health: 100
Player is down!
Health: 0
Health: 10Tulis kodemu di player.gd. main.gd berisi kode input/output yang disediakan dan tidak boleh diedit.
Coba sendiri
extends Node
func _ready():
# Kode input/output yang disediakan: biarkan apa adanya
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)
Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.
Semua pelajaran di Pemrograman Berorientasi Objek
1Dasar-Dasar OOP
File EksternalPengantar OOPclass dan objectKata Kunci selfmethodpropertyKonstruktor (_init)Ringkasan: Kalkulator Sederhana4Polimorfisme
Method Overriding Sekali LagiDuck TypingKelas Abstrak dan MethodDesain InterfaceRingkasan: Kalkulator Bentuk7Sinyal
Apa itu Sinyal?Mendeklarasikan dan MemancarkanMenghubungkan ke SinyalSinyal dengan ArgumenRangkuman, Sistem Kesehatan10Pola Desain Bagian 2
Pola CommandPola AdapterPola DecoratorPola Template MethodPola StatePola Composite2Property class
Variabel instance vs. variabel statisFungsi statisSetter propertyGetter propertyPrivat berdasarkan konvensiRangkuman: Pengelola Rekening Bank5Enkapsulasi
Member Publik dan PrivatValidasi dengan SetterPenyembunyian InformasiProperty Hanya-BacaRingkasan: Sistem Catatan Siswa8Konsep OOP Lanjutan
Komposisi vs PewarisanInner ClassNode sebagai KomponenRefCounted vs NodeEnum dalam Class11Proyek: Manajemen Perpustakaan
Gambaran Umum Proyekclass Buku dan PenggunaLatihan sendiri: Compiler GDScript online