Pola Template Method
Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan GDScript di Coddy. Pelajaran 53 dari 65.
Pola Template Method menetapkan urutan langkah algoritma di class induk dan memungkinkan setiap subclass mengisi beberapa langkah. Method induk yang menjalankan langkah-langkah tersebut adalah template method.
# level.gd
@abstract
class_name Level
extends RefCounted
func play() -> void:
print("Loading ", get_level_name())
spawn_enemies()
print("Level complete!")
@abstract func get_level_name() -> String
@abstract func spawn_enemies() -> voidplay() adalah templat: setiap level dimuat, memunculkan musuhnya, lalu selesai, dalam urutan ini. Langkah-langkah yang berbeda bersifat abstrak, jadi setiap subclass harus menuliskannya:
# forest_level.gd
class_name ForestLevel
extends Level
func get_level_name() -> String:
return "Forest"
func spawn_enemies() -> void:
print("3 wolves appear")CaveLevel ditulis dengan cara yang sama, dengan nama "Cave" dan 5 bats appear.
# main.gd
var levels: Array[Level] = [ForestLevel.new(), CaveLevel.new()]
for level in levels:
level.play()Loading Forest
3 wolves appear
Level complete!
Loading Cave
5 bats appear
Level complete!Sebuah langkah juga dapat memiliki nilai default di parent yang dapat ditimpa oleh subclass. Langkah opsional seperti ini disebut hook:
# level.gd
func play() -> void:
print("Loading ", get_level_name())
spawn_enemies()
if has_boss():
print("The boss arrives")
print("Level complete!")
func has_boss() -> bool:
return falseHanya level yang mengganti has_boss() agar mengembalikan true yang mendapatkan baris bos. Subclass menulis langkah-langkah, lalu parent menentukan kapan langkah-langkah itu dijalankan, jadi subclass membiarkan play() apa adanya dan setiap level mengikuti urutan yang sama.
Tantangan
SedangSebuah game mengekspor skornya dalam dua format dengan langkah yang sama. Baris berupa dictionary dengan "name" dan "score".
- Di
exporter.gd, tulis template methodexport_rows(rows): fungsi ini mencetakheader(), laluformat_row(row)untuk setiap baris, kemudianfooter(rows). Header atau footer yang berupa string kosong tidak dicetak. Hookheader()danfooter()mengembalikan""secara default, danformat_row()bersifat abstrak. CsvExporter: header-nya adalahname,score, dan satu baris adalahAda,12. Tanpa footer.ListExporter: tanpa header, satu baris adalah* Ada scored 12, dan footer-nya adalahPlayers: Ndengan jumlah baris.
Kode yang disediakan membaca format (csv atau list), jumlah baris berikutnya, lalu satu baris NAME SCORE per baris. Untuk list dengan Ada 12 dan Bo 7, output-nya adalah:
* Ada scored 12
* Bo scored 7
Players: 2Kodemu ditulis di exporter.gd, csv_exporter.gd, dan list_exporter.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 tetap seperti ini
var style := OS.read_string_from_stdin()
var rows: Array = []
var count := int(OS.read_string_from_stdin())
for i in count:
var parts := OS.read_string_from_stdin().split(" ")
rows.append({"name": parts[0], "score": int(parts[1])})
var exporter: Exporter = CsvExporter.new()
if style == "list":
exporter = ListExporter.new()
exporter.export_rows(rows)
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