Menu
CoddyTech

Wzorzec metody szablonowej

Część sekcji Programowanie obiektowe ścieżki GDScript w Coddy. Lekcja 53 z 65.

Wzorzec Template Method ustala kolejność kroków algorytmu w klasie nadrzędnej i pozwala każdej klasie podrzędnej uzupełnić niektóre z tych kroków. Metoda nadrzędna, która wykonuje te kroki, to metoda szablonowa.

# 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() to szablon: każdy poziom wczytuje się, przywołuje swoich wrogów i kończy działanie, w tej kolejności. Kroki, które się różnią, są abstrakcyjne, więc każda podklasa musi je zaimplementować:

# forest_level.gd
class_name ForestLevel
extends Level

func get_level_name() -> String:
	return "Forest"

func spawn_enemies() -> void:
	print("3 wolves appear")

CaveLevel jest zapisane tak samo, z nazwą "Cave" i tekstem 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!

Krok może mieć także wartość domyślną w klasie nadrzędnej, którą podklasa może nadpisać. Taki opcjonalny krok nazywa się punktem zaczepienia:

# 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

Tylko poziom, który nadpisuje has_boss(), aby zwracała true, otrzymuje linię bossa. Podklasy zapisują kroki, a klasa nadrzędna decyduje, kiedy są wykonywane, więc podklasa pozostawia play() bez zmian i każdy poziom zachowuje tę samą kolejność.

challenge icon

Wyzwanie

Średni

Gra eksportuje wyniki w dwóch formatach, wykonując te same kroki. Wiersze to słowniki zawierające "name" i "score".

  • W pliku exporter.gd napisz metodę szablonową export_rows(rows): wypisuje ona header(), następnie format_row(row) dla każdego wiersza, a potem footer(rows). Nagłówek ani stopka będące pustym ciągiem znaków nie są wypisywane. Haki header() i footer() domyślnie zwracają "", a format_row() jest abstrakcyjna.
  • CsvExporter: nagłówek to name,score, a wiersz to Ada,12. Bez stopki.
  • ListExporter: bez nagłówka, wiersz to * Ada scored 12, a stopka to Players: N z liczbą wierszy.

Dostarczony kod odczytuje format (csv lub list), liczbę kolejnych wierszy, a następnie po jednym wierszu NAME SCORE w każdym wierszu. Dla list z danymi Ada 12 i Bo 7 wynikiem jest:

* Ada scored 12
* Bo scored 7
Players: 2

Umieść swój kod w plikach exporter.gd, csv_exporter.gd i list_exporter.gd. Plik main.gd zawiera dostarczony kod wejścia/wyjścia i nie można go edytować.

Spróbuj swoich sił

extends Node

func _ready():
	# Dostarczony kod wejścia/wyjścia: pozostaw go bez zmian
	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 iconSprawdź się

Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.

Wszystkie lekcje w sekcji Programowanie obiektowe

Poćwicz samodzielnie: Kompilator GDScript online