Member Publik dan Privat
Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan GDScript di Coddy. Pelajaran 26 dari 65.
Enkapsulasi berarti sebuah object menyimpan datanya bersama method yang mengubah data tersebut, lalu menentukan anggota mana yang boleh digunakan oleh kode lain. Anggota yang ditujukan untuk kode lain membentuk antarmuka object tersebut.
GDScript tidak memiliki kata kunci public atau private: setiap anggota dapat diakses dari luar. Panduan gaya Godot menandai anggota privat dengan garis bawah di awal:
# bank_account.gd
class_name BankAccount
extends RefCounted
var owner_name: String
var _balance: int = 0
var _history: Array[String] = []
func _init(holder: String) -> void:
owner_name = holder
func deposit(amount: int) -> void:
_balance += amount
_record("deposit %d" % amount)
func get_balance() -> int:
return _balance
func _record(entry: String) -> void:
_history.append(entry)owner_name, deposit(), dan get_balance() bersifat publik, jadi main.gd menggunakannya. _balance, _history, dan _record() bersifat privat: hanya kode di dalam bank_account.gd yang menggunakannya.
# main.gd
var account := BankAccount.new("Ada")
account.deposit(50)
account.deposit(20)
print(account.owner_name) # Ada
print(account.get_balance()) # 70Garis bawah adalah konvensi, bukan pengunci: account._balance = 1000000 di main.gd berjalan tanpa error. Tetap ikuti konvensi ini. Jika hanya class yang mengubah _balance, saldo yang salah hanya bisa berasal dari method di bank_account.gd, jadi hanya file itu yang perlu kamu periksa.
GDScript juga tidak memiliki tingkat protected. Sebuah subclass mewarisi setiap member, termasuk yang private, jadi SavingsAccount yang extends BankAccount dapat menggunakan _balance dalam method-nya sendiri.
Virtual method Godot, seperti _init() dan _ready(), juga diawali dengan garis bawah. Godot memanggilnya untukmu, jadi jangan pernah memberi salah satu method pribadimu nama yang sama.
Tantangan
MudahLengkapi class Hero di hero.gd. Anggota publiknya adalah hero_name, gain_xp(), get_xp(), dan get_level(). Bagian lainnya bersifat privat:
- Tambahkan variabel privat
_xp(dimulai dari0) dan_level(dimulai dari1). - Tambahkan method privat
_update_level(), yang menetapkan_levelmenjadi1 + _xp / 100(pembagian bilangan bulat). gain_xp(amount)menambahkanamountke_xp, memanggil_update_level(), dan mengembalikantruesaat level naik, ataufalsejika tidak.get_xp()danget_level()mengembalikan nilai privat.
Kode yang disediakan membaca nama hero, lalu jumlah nilai XP yang menyusul, kemudian satu nilai untuk setiap baris. Setelah setiap nilai, kode mencetak baris Level up! jika gain_xp() mengembalikan true, lalu mencetak status hero. Untuk Ada dan nilai 40, 70, dan 250, kode mencetak:
Ada: 40 XP, level 1
Level up! Ada is now level 2
Ada: 110 XP, level 2
Level up! Ada is now level 4
Ada: 360 XP, level 4Letakkan kodemu di hero.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 hero := Hero.new(OS.read_string_from_stdin())
var count := int(OS.read_string_from_stdin())
for i in count:
var amount := int(OS.read_string_from_stdin())
if hero.gain_xp(amount):
print("Level up! %s is now level %d" % [hero.hero_name, hero.get_level()])
print("%s: %d XP, level %d" % [hero.hero_name, hero.get_xp(), hero.get_level()])
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