Pengantar Virtual Method
Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan GDScript di Coddy. Pelajaran 31 dari 65.
Python memiliki magic method seperti __init__ dan __str__, yang dipanggil oleh bahasa tersebut untukmu. Versi Godot adalah virtual method: method dengan nama tetap yang diawali garis bawah, yang kamu definisikan di class-mu dan dipanggil Godot pada saat yang tepat. Kamu sudah menggunakan dua di antaranya:
_init()dijalankan saatnew()membuat object, dengan argumen yang diberikan kenew()._ready()dijalankan saat node memasuki scene tree, tempatmain.gddimulai.
Contoh lainnya adalah _to_string(), yang dipanggil saat sebuah object dicetak, method iterator yang memungkinkan perulangan for menelusuri sebuah object (keduanya dibahas dalam pelajaran berikutnya), dan _notification(), yang menerima event dari engine. Salah satunya, NOTIFICATION_PREDELETE, muncul tepat sebelum object dihapus:
# torch.gd
class_name Torch
extends RefCounted
var label: String
func _init(new_label: String = "Torch") -> void:
label = new_label
print(label, " lit")
func _notification(what: int) -> void:
if what == NOTIFICATION_PREDELETE:
print(label, " burned out")# main.gd
var torch := Torch.new("Hall torch") # Hall torch menyala
torch = null # Hall torch padamObject RefCounted dihapus segera setelah tidak ada lagi variabel yang merujuk kepadanya, jadi torch = null langsung mengirimkan pemberitahuan. Nilai default di _init() membuat argumen new() bersifat opsional: Torch.new() membuat obor bernama Torch.
Python juga menggunakan method ajaib untuk operator, seperti __add__ untuk + dan __eq__ untuk ==. GDScript tidak mendukung overloading operator: potion_a + potion_b adalah error. Tulis method sebagai gantinya:
# potion.gd
class_name Potion
extends RefCounted
var power: int
func _init(start_power: int) -> void:
power = start_power
func combined(other: Potion) -> Potion:
return Potion.new(power + other.power)potion_a.combined(potion_b) mengembalikan potion baru dan membiarkan kedua potion asli tetap tidak berubah. == di antara dua object memeriksa apakah kedua sisi adalah object yang sama, bukan apakah nilainya cocok: Potion.new(5) == Potion.new(5) menghasilkan false. Tulis method seperti equals(other) saat kamu perlu membandingkan nilai.
Tantangan
MudahTulis class Counter di counter.gd:
_init(start = 0, step_size = 1)menyimpan nilai awal divaluedan ukuran langkah distep. Nilai default sudah ada di tanda tangan fungsi, jadiCounter.new(),Counter.new(5), danCounter.new(5, 2)semuanya berfungsi.tick()menambahkanstepkevalue.plus(other)menggantikan operator+, yang tidak memungkinkan kamu definisikan di GDScript: fungsi ini mengembalikanCounterbaru dengan nilai berupa jumlah kedua nilai dan langkah berupa langkah counter ini. Kedua counter tidak berubah.equals(other)mengembalikantruesaat kedua counter memiliki nilai yang sama.
Kode yang disediakan membaca dua baris untuk membuat counter a dan b (baris kosong, START, atau START STEP), lalu satu baris berisi berapa kali a dan b harus di-tick. Kode ini mencetak kedua counter, jumlahnya, apakah nilainya sama, dan apakah a == b. Untuk baris 5, 2 3, dan 3 1, kode ini mencetak:
a: 8 (step 1)
b: 5 (step 3)
a plus b: 13 (step 1)
same value: false
same object: falseTulis kodemu di counter.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 tetap seperti adanya
var a := make_counter(OS.read_string_from_stdin())
var b := make_counter(OS.read_string_from_stdin())
var ticks := OS.read_string_from_stdin().split(" ")
for i in int(ticks[0]):
a.tick()
for i in int(ticks[1]):
b.tick()
print("a: %d (step %d)" % [a.value, a.step])
print("b: %d (step %d)" % [b.value, b.step])
var total := a.plus(b)
print("a plus b: %d (step %d)" % [total.value, total.step])
print("same value: %s" % a.equals(b))
print("same object: %s" % (a == b))
func make_counter(line: String) -> Counter:
var parts := line.split(" ", false)
if parts.is_empty():
return Counter.new()
if parts.size() == 1:
return Counter.new(int(parts[0]))
return Counter.new(int(parts[0]), int(parts[1]))
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