Pattern Template Method
Fa parte della sezione Programmazione orientata agli oggetti del percorso GDScript di Coddy. Lezione 53 di 65.
Il pattern Template Method fissa l'ordine dei passaggi di un algoritmo in una classe genitore e permette a ogni sottoclasse di completarne alcuni. Il metodo genitore che esegue i passaggi è il 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() è il modello: ogni livello viene caricato, fa apparire i suoi nemici e viene completato, in quest'ordine. I passaggi che differiscono sono astratti, quindi ogni sottoclasse deve scriverli:
# forest_level.gd
class_name ForestLevel
extends Level
func get_level_name() -> String:
return "Forest"
func spawn_enemies() -> void:
print("3 wolves appear")CaveLevel è scritto allo stesso modo, con il nome "Cave" e 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!Un passaggio può anche avere un valore predefinito nella classe genitore che una sottoclasse può sovrascrivere. Un passaggio opzionale di questo tipo si chiama 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 falseSolo un livello che sovrascrive has_boss() per restituire true ottiene la riga del boss. Le sottoclassi definiscono i passaggi e la classe genitore decide quando vengono eseguiti, quindi una sottoclasse lascia invariato play() e ogni livello segue lo stesso ordine.
Sfida
MedioUn gioco esporta i propri punteggi in due formati seguendo gli stessi passaggi. Le righe sono Dictionary con un "name" e un "score".
- In
exporter.gd, scrivi il metodo templateexport_rows(rows): stampaheader(), poiformat_row(row)per ogni riga e infinefooter(rows). Un’intestazione o un piè di pagina che è una stringa vuota non viene stampato. Gli hookheader()efooter()restituiscono""per impostazione predefinita, mentreformat_row()è astratto. CsvExporter: l’intestazione èname,scoree una riga èAda,12. Nessun piè di pagina.ListExporter: nessuna intestazione, una riga è* Ada scored 12e il piè di pagina èPlayers: N, dove N è il numero di righe.
Il codice fornito legge il formato (csv o list), il numero di righe successive e poi una riga NAME SCORE per linea. Per list con Ada 12 e Bo 7, l’output è:
* Ada scored 12
* Bo scored 7
Players: 2Il tuo codice va inserito in exporter.gd, csv_exporter.gd e list_exporter.gd. main.gd contiene il codice di input/output fornito e non può essere modificato.
Provalo tu
extends Node
func _ready():
# Supplied input/output code: keep it as it is
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)
Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.
Tutte le lezioni di Programmazione orientata agli oggetti
1Fondamenti della programmazione orientata agli oggetti
File esterniIntroduzione alla programmazione orientata agli oggettiClassi e oggetti a confrontoLa parola chiave selfMetodiProprietàCostruttore (_init)Riepilogo - Calcolatrice semplice4Polimorfismo
Ripasso dell'override dei metodiDuck typingClassi e metodi astrattiProgettazione delle interfacceRiepilogo - Calcolatore di forme7Segnali
Che cos'è un segnale?Dichiarare ed emettereCollegarsi ai segnaliSegnali con argomentiRipasso - Sistema della salute10Pattern di progettazione, parte 2
Pattern CommandPattern AdapterPattern DecoratorPattern Template MethodPattern StatePattern Composite2Proprietà delle classi
Variabili di istanza e staticheFunzioni staticheSetter delle proprietàGetter delle proprietàPrivato per convenzioneRiepilogo - Gestore di conti bancari5Incapsulamento
Membri pubblici e privatiValidazione con i setterNascondimento delle informazioniProprietà di sola letturaRiepilogo - Sistema di gestione dei dati degli studenti8Concetti avanzati di OOP
Composizione vs ereditarietàClassi interneNodi come componentiRefCounted vs NodeEnum nelle classi11Progetto: Gestione della biblioteca
Panoramica del progettoClassi Libro e Utente3Ereditarietà
Ereditarietà di baseLa parola chiave superOverride dei metodiCatene di ereditarietàControlli di tipo con isRipasso - Gerarchia dei dipendenti6Metodi speciali
Introduzione ai metodi virtualiIl metodo _to_stringIteratori personalizzatiRiepilogo - Lista personalizzata9Modelli di progettazione, parte 1
Introduzione ai modelli di progettazionePattern SingletonPattern FactoryPattern ObserverPattern StrategyEsercitati da solo: Compilatore GDScript online