템플릿 메서드 패턴
Coddy GDScript 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨. 65개 중 53번째.
템플릿 메서드 패턴은 부모 클래스에서 알고리즘 단계의 순서를 고정하고, 각 하위 클래스가 일부 단계를 채우도록 합니다. 단계를 실행하는 부모 메서드가 템플릿 메서드입니다.
# 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()는 템플릿입니다. 모든 레벨은 이 순서대로 로드되고, 적을 생성하며, 완료됩니다. 서로 다른 단계는 추상적이므로 모든 하위 클래스에서 이를 작성해야 합니다.
# forest_level.gd
class_name ForestLevel
extends Level
func get_level_name() -> String:
return "Forest"
func spawn_enemies() -> void:
print("3 wolves appear")CaveLevel도 같은 방식으로 작성되며, 이름은 "Cave"이고 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!단계에는 부모 클래스에 기본값을 지정하여 서브클래스가 재정의할 수 있도록 할 수도 있습니다. 이러한 선택적 단계를 후크라고 합니다:
# 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 falsehas_boss()를 재정의하여 true를 반환하는 레벨만 보스 줄을 얻습니다. 하위 클래스는 단계를 작성하고 부모 클래스는 단계가 실행되는 시점을 결정하므로, 하위 클래스는 play()를 그대로 두며 모든 레벨이 같은 순서를 따릅니다.
챌린지
중급게임은 동일한 단계로 두 가지 형식으로 점수를 내보냅니다. 행은 "name"과 "score"를 포함하는 딕셔너리입니다.
exporter.gd에서 템플릿 메서드export_rows(rows)를 작성하세요. 이 메서드는header()를 출력한 다음 모든 행에 대해format_row(row)를 출력하고, 마지막으로footer(rows)를 출력합니다. 헤더나 푸터가 빈 문자열이면 출력하지 않습니다. 후크인header()와footer()는 기본적으로""를 반환하고,format_row()는 추상 메서드입니다.CsvExporter: 헤더는name,score이고, 행은Ada,12입니다. 푸터는 없습니다.ListExporter: 헤더는 없고, 행은* Ada scored 12이며, 푸터는 행 수를 나타내는Players: N입니다.
제공된 코드는 형식(csv 또는 list)과 이어지는 행의 개수를 읽은 다음, 각 줄에서 NAME SCORE 형식의 행을 하나씩 읽습니다. Ada 12와 Bo 7이 입력된 list의 출력은 다음과 같습니다.
* Ada scored 12
* Bo scored 7
Players: 2코드는 exporter.gd, csv_exporter.gd, list_exporter.gd에 작성하세요. main.gd에는 제공된 입출력 코드가 있으며 수정할 수 없습니다.
직접 해보기
extends Node
func _ready():
# 제공된 입출력 코드: 그대로 두세요
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)
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
객체 지향 프로그래밍의 모든 레슨
직접 연습해 보세요: 온라인 GDScript 컴파일러