Property Hanya-Baca
Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan GDScript di Coddy. Pelajaran 29 dari 65.
Beberapa nilai sebaiknya dapat dibaca dari luar, tetapi tidak pernah ditetapkan: ID yang diberikan satu kali saat object dibuat, atau nilai yang dihitung dari data lain, seperti luas atau total. Property dengan blok get dan tanpa blok set melakukan hal itu:
# ticket.gd
class_name Ticket
extends RefCounted
var _number: int
var number: int:
get:
return _number
func _init(start_number: int) -> void:
_number = start_numberKonstruktor menyimpan nilai di dalam _number privat, dan number publik hanya mengembalikannya. Menetapkan nilai ke number dari luar bukanlah error, tetapi tidak mengubah apa pun, karena getter terus mengembalikan _number:
var ticket := Ticket.new(42)
ticket.number = 7
print(ticket.number) # 42property terhitung tidak memiliki nilai sendiri: getter-nya menghitung nilainya setiap kali dibaca, sehingga nilainya selalu sesuai dengan data asalnya:
# 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 biasa harus diperbarui secara manual setiap kali width atau length berubah, dan satu pembaruan yang terlupa akan membuatnya salah. area yang dihitung tidak akan kedaluwarsa, dan tidak ada yang bisa memberikan nilai yang salah kepadanya.
Untuk nilai yang sama bagi setiap object dan tidak pernah berubah, gunakan konstanta di dalam class: const MAX_GUESTS = 4. Penetapan nilai ke konstanta akan dilaporkan sebelum program dijalankan.
Tantangan
Mudahclass Order di order.gd menyimpan ID-nya di _id dan total setiap baris di _line_totals (harga dikali jumlah). Jadikan keempat property publiknya hanya-baca dengan blok get:
order_idmengembalikan_id.subtotalmengembalikan jumlah_line_totals.shippingmengembalikan0saat subtotal bernilai50atau lebih, selain itu5.totalmengembalikan subtotal ditambah shipping.
Kode yang disediakan membaca ID pesanan, jumlah item, lalu satu baris price quantity untuk setiap item. Setelah setiap item, kode mencetak subtotal, shipping, dan total. Di akhir, kode mencoba menetapkan nilai 0 ke keempat property, lalu mencetak ID dan total, yang harus tetap tidak berubah. Untuk ID 7 dan item 12 2 serta 30 1, kode mencetak:
Subtotal 24, shipping 5, total 29
Subtotal 54, shipping 0, total 54
Order #7: 54Tulis kodemu di order.gd. main.gd berisi kode input/output yang disediakan dan tidak dapat diedit.
Coba sendiri
extends Node
func _ready():
# Kode input/output yang disediakan: biarkan apa adanya
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])
# Kode yang mencoba menimpa property yang hanya bisa dibaca
order.order_id = 0
order.subtotal = 0
order.shipping = 0
order.total = 0
print("Order #%d: %d" % [order.order_id, order.total])
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