Vorlagenmethoden-Muster
Teil des Abschnitts Objektorientierte Programmierung der GDScript-Journey von Coddy. Lektion 53 von 65.
Das Template-Method-Muster legt die Reihenfolge der Schritte eines Algorithmus in einer Elternklasse fest und ermöglicht es jeder Unterklasse, einige der Schritte auszufüllen. Die Elternmethode, die die Schritte ausführt, ist die Template-Methode.
# 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() ist die Vorlage: Jedes Level wird geladen, lässt seine Gegner erscheinen und wird in dieser Reihenfolge abgeschlossen. Die Schritte, die sich unterscheiden, sind abstrakt, daher muss jede Unterklasse sie schreiben:
# forest_level.gd
class_name ForestLevel
extends Level
func get_level_name() -> String:
return "Forest"
func spawn_enemies() -> void:
print("3 wolves appear")CaveLevel wird auf dieselbe Weise geschrieben, mit dem Namen "Cave" und 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!Ein Schritt kann auch in der Elternklasse einen Standardwert haben, den eine Unterklasse überschreiben kann. Ein solcher optionaler Schritt wird als Hook bezeichnet:
# 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 falseNur ein Level, das has_boss() überschreibt, sodass es true zurückgibt, erhält die Boss-Zeile. Die Unterklassen schreiben die Schritte, und die übergeordnete Klasse entscheidet, wann sie ausgeführt werden. Daher lässt eine Unterklasse play() unverändert, und jedes Level folgt derselben Reihenfolge.
Aufgabe
MittelEin Spiel exportiert seine Punktestände in zwei Formaten mit denselben Schritten. Zeilen sind Dictionaries mit einem "name" und einem "score".
- Schreibe in
exporter.gddie Template-Methodeexport_rows(rows): Sie gibtheader()aus, dann für jede Zeileformat_row(row)und anschließendfooter(rows). Ein Header oder Footer, der eine leere Zeichenfolge ist, wird nicht ausgegeben. Die Hooksheader()undfooter()geben standardmäßig""zurück, undformat_row()ist abstrakt. CsvExporter: Der Header istname,score, und eine Zeile istAda,12. Kein Footer.ListExporter: kein Header, eine Zeile ist* Ada scored 12, und der Footer lautetPlayers: Nmit der Anzahl der Zeilen.
Der bereitgestellte Code liest das Format (csv oder list), die Anzahl der folgenden Zeilen und dann pro Zeile eine NAME SCORE-Zeile. Für list mit Ada 12 und Bo 7 lautet die Ausgabe:
* Ada scored 12
* Bo scored 7
Players: 2Dein Code gehört in exporter.gd, csv_exporter.gd und list_exporter.gd. main.gd enthält den bereitgestellten Ein-/Ausgabecode und kann nicht bearbeitet werden.
Probier es selbst
extends Node
func _ready():
# Vorgegebener Ein-/Ausgabecode: unverändert lassen
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)
Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Objektorientierte Programmierung
1Grundlagen der OOP
Externe DateienEinführung in die OOPKlassen vs. ObjekteDas Schlüsselwort selfMethodenEigenschaftenKonstruktor (_init)Wiederholung – Einfacher Taschenrechner4Polymorphie
Methodenüberschreibung erneut betrachtetDuck-TypisierungAbstrakte Klassen und MethodenSchnittstellendesignRückblick – Formrechner7Signale
Was ist ein Signal?Deklarieren und AuslösenMit Signalen verbindenSignale mit ArgumentenRückblick – Gesundheitssystem10Entwurfsmuster Teil 2
Befehl-MusterAdapter-MusterDekorierer-MusterVorlagenmethoden-MusterZustandsmusterKompositum-Muster2Klassenattribute
Instanz- vs. statische VariablenStatische FunktionenProperty-SetterProperty-GetterPrivat nach KonventionWiederholung – Bankkontenverwaltung5Kapselung
Öffentliche und private MemberValidierung mit SetternInformationsverbergenSchreibgeschützte EigenschaftenRückblick – System zur Schülerverwaltung8Fortgeschrittene OOP-Konzepte
Komposition vs. VererbungInnere KlassenNodes als KomponentenRefCounted vs. NodeEnums in Klassen11Projekt: Bibliotheksverwaltung
ProjektübersichtBuch- und Benutzerklassen3Vererbung
Grundlegende VererbungDas Schlüsselwort superMethodenüberschreibungVererbungskettenTypprüfungen mit isWiederholung – Mitarbeiterhierarchie6Spezielle Methoden
Einführung in virtuelle MethodenDie _to_string-MethodeBenutzerdefinierte IteratorenRückblick – Benutzerdefinierte Liste9Entwurfsmuster Teil 1
Einführung in EntwurfsmusterSingleton-MusterFactory-MusterBeobachter-MusterStrategie-Muster12Abschließende Herausforderungen
E-Learning-PlattformBankensystemEntwicklung von SpielfigurenFahrzeugvermietungÜbe selbstständig: Online-GDScript-Compiler