Menu
CoddyTech

Şablon Metot Kalıbı

Coddy'nin GDScript Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 53 / 65.

Şablon Metot deseni, bir algoritmanın adımlarının sırasını üst sınıfta belirler ve her alt sınıfın adımların bazılarını tamamlamasına olanak tanır. Adımları çalıştıran üst sınıf metodu, şablon metottur.

# 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() şablondur: her seviye bu sırayla yüklenir, düşmanlarını oluşturur ve tamamlanır. Farklılık gösteren adımlar soyuttur, bu nedenle her alt sınıf bunları yazmalıdır:

# forest_level.gd
class_name ForestLevel
extends Level

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

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

CaveLevel aynı şekilde, "Cave" adıyla ve 5 bats appear ifadesiyle yazılır.

# 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!

Bir adımın, alt sınıfın geçersiz kılabileceği bir üst sınıf varsayılanı da olabilir. Böyle isteğe bağlı bir adıma kanca denir:

# 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

Yalnızca has_boss() metodunu true döndürecek şekilde geçersiz kılan bir seviye, patron satırını alır. Alt sınıflar adımları yazar, üst sınıf ise bunların ne zaman çalışacağına karar verir; bu nedenle bir alt sınıf play() metoduna dokunmaz ve her seviye aynı sırayı izler.

challenge icon

Görev

Orta

Bir oyun, puanlarını aynı adımları izleyerek iki biçimde dışa aktarır. Satırlar, "name" ve "score" içeren Dictionary'lerdir.

  • exporter.gd dosyasında, şablon yöntemi export_rows(rows)'u yaz: header()'ı, ardından her satır için format_row(row)'u ve son olarak footer(rows)'u yazdırır. Boş bir dize olan başlık veya altbilgi yazdırılmaz. header() ve footer() kancaları varsayılan olarak "" döndürür ve format_row() soyuttur.
  • CsvExporter: başlık name,score, bir satır ise Ada,12'dir. Altbilgi yoktur.
  • ListExporter: başlık yoktur, bir satır * Ada scored 12'dir ve altbilgi, satır sayısını içeren Players: N'dir.

Sağlanan kod biçimi (csv veya list), ardından gelecek satır sayısını ve sonra her satırda bir NAME SCORE satırını okur. Ada 12 ve Bo 7 ile list için çıktı şöyledir:

* Ada scored 12
* Bo scored 7
Players: 2

Kodunu exporter.gd, csv_exporter.gd ve list_exporter.gd dosyalarına yaz. main.gd, sağlanan giriş/çıkış kodunu içerir ve düzenlenemez.

Kendin dene

extends Node

func _ready():
	# Sağlanan giriş/çıkış kodu: olduğu gibi bırakın
	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 iconKendini test et

Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.

Nesne Yönelimli Programlama bölümündeki tüm dersler

Kendi başına pratik yap: Online GDScript derleyicisi