Menu
CoddyTech

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() -> void

play() 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 false

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

challenge icon

Aufgabe

Mittel

Ein Spiel exportiert seine Punktestände in zwei Formaten mit denselben Schritten. Zeilen sind Dictionaries mit einem "name" und einem "score".

  • Schreibe in exporter.gd die Template-Methode export_rows(rows): Sie gibt header() aus, dann für jede Zeile format_row(row) und anschließend footer(rows). Ein Header oder Footer, der eine leere Zeichenfolge ist, wird nicht ausgegeben. Die Hooks header() und footer() geben standardmäßig "" zurück, und format_row() ist abstrakt.
  • CsvExporter: Der Header ist name,score, und eine Zeile ist Ada,12. Kein Footer.
  • ListExporter: kein Header, eine Zeile ist * Ada scored 12, und der Footer lautet Players: N mit 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: 2

Dein 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)
quiz iconTeste dich selbst

Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.

Alle Lektionen in Objektorientierte Programmierung

Übe selbstständig: Online-GDScript-Compiler