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() -> voidplay() 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 falseTylko 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ść.
Wyzwanie
ŚredniGra eksportuje wyniki w dwóch formatach, wykonując te same kroki. Wiersze to słowniki zawierające "name" i "score".
- W pliku
exporter.gdnapisz metodę szablonowąexport_rows(rows): wypisuje onaheader(), następnieformat_row(row)dla każdego wiersza, a potemfooter(rows). Nagłówek ani stopka będące pustym ciągiem znaków nie są wypisywane. Hakiheader()ifooter()domyślnie zwracają"", aformat_row()jest abstrakcyjna. CsvExporter: nagłówek toname,score, a wiersz toAda,12. Bez stopki.ListExporter: bez nagłówka, wiersz to* Ada scored 12, a stopka toPlayers: Nz 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: 2Umieść 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)
Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.
Wszystkie lekcje w sekcji Programowanie obiektowe
1Podstawy programowania obiektowego
Pliki zewnętrzneWprowadzenie do programowania obiektowegoKlasy a obiektySłowo kluczowe selfMetodyWłaściwościKonstruktor (_init)Powtórka – prosty kalkulator4Polimorfizm
Ponowne omówienie przesłaniania metodDuck typingKlasy i metody abstrakcyjneProjektowanie interfejsówPowtórzenie – kalkulator kształtów7Sygnały
Czym jest sygnał?Deklarowanie i emitowanieŁączenie z sygnałamiSygnały z argumentamiPodsumowanie — system zdrowia10Wzorce projektowe, część 2
Wzorzec poleceniaWzorzec adapteraWzorzec dekoratoraWzorzec metody szablonowejWzorzec stanuWzorzec kompozytu2Właściwości klas
Zmienne instancji a zmienne statyczneFunkcje statyczneSettery właściwościGettery właściwościPrywatne z konwencjiPodsumowanie — menedżer kont bankowych5Enkapsulacja
Elementy publiczne i prywatneWalidacja za pomocą setterówUkrywanie informacjiWłaściwości tylko do odczytuPodsumowanie – system ewidencji uczniów8Zaawansowane koncepcje OOP
Kompozycja a dziedziczenieKlasy wewnętrzneWęzły jako komponentyRefCounted a NodeTypy wyliczeniowe w klasach11Projekt: Zarządzanie biblioteką
Przegląd projektuKlasy książki i użytkownika3Dziedziczenie
Podstawy dziedziczeniaSłowo kluczowe superNadpisywanie metodŁańcuchy dziedziczeniaSprawdzanie typów za pomocą isPodsumowanie – hierarchia pracowników6Metody specjalne
Wprowadzenie do metod wirtualnychMetoda _to_stringWłasne iteratoryPodsumowanie — własna lista9Wzorce projektowe — część 1
Wprowadzenie do wzorców projektowychWzorzec SingletonWzorzec FactoryWzorzec ObserverWzorzec StrategyPoćwicz samodzielnie: Kompilator GDScript online