Menu
CoddyTech

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 saat new() membuat object, dengan argumen yang diberikan ke new().
  • _ready() dijalankan saat node memasuki scene tree, tempat main.gd dimulai.

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 padam

Object 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.

challenge icon

Tantangan

Mudah

Tulis class Counter di counter.gd:

  • _init(start = 0, step_size = 1) menyimpan nilai awal di value dan ukuran langkah di step. Nilai default sudah ada di tanda tangan fungsi, jadi Counter.new(), Counter.new(5), dan Counter.new(5, 2) semuanya berfungsi.
  • tick() menambahkan step ke value.
  • plus(other) menggantikan operator +, yang tidak memungkinkan kamu definisikan di GDScript: fungsi ini mengembalikan Counter baru dengan nilai berupa jumlah kedua nilai dan langkah berupa langkah counter ini. Kedua counter tidak berubah.
  • equals(other) mengembalikan true saat 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: false

Tulis 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]))
quiz iconUji dirimu

Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.

Semua pelajaran di Pemrograman Berorientasi Objek

Latihan sendiri: Compiler GDScript online