Menu
CoddyTech

Innere Klassen

Teil des Abschnitts Objektorientierte Programmierung der GDScript-Journey von Coddy. Lektion 41 von 65.

Eine Klasse kann mit dem Schlüsselwort class, einem Namen und einem eingerückten Rumpf eine weitere Klasse in sich deklarieren. Diese innere Klasse ist ein Hilfstyp, der zur äußeren Klasse gehört:

# inventory.gd
class_name Inventory
extends RefCounted

const MAX_STACK := 5

class Slot:
	var item_name: String
	var count: int

	func _init(new_name: String, new_count: int) -> void:
		item_name = new_name
		count = mini(new_count, MAX_STACK)

	func _to_string() -> String:
		return "%s x%d" % [item_name, count]

var slots: Array[Slot] = []

func add(item_name: String, count: int) -> Slot:
	var slot := Slot.new(item_name, count)
	slots.append(slot)
	return slot

In inventory.gd ist die innere Klasse Slot. Jede andere Datei greift über die äußere Klasse darauf zu: Inventory.Slot.

# main.gd
var bag := Inventory.new()
bag.add("Potion", 9)
var arrows: Inventory.Slot = bag.add("Arrow", 3)
print(bag.slots)    # [Potion x5, Arrow x3]
var gem := Inventory.Slot.new("Gem", 1)

Eine innere Klasse ohne extends erbt von RefCounted und kann wie jede Klasse Variablen, einen Konstruktor und Methoden haben. Sie kann die Konstanten und Enumerationen der äußeren Klasse verwenden (MAX_STACK oben), aber nicht deren Membervariablen: Slot hat keinen Zugriff auf slots, da ein Slot ein separates Objekt ist. Übergebe alle Werte, die sie benötigt, an ihren Konstruktor.

Verwende eine innere Klasse für einen kleinen Typ, der nur zusammen mit seiner äußeren Klasse sinnvoll ist, etwa ein Platz in einem Inventar oder ein Eintrag in einer Punktetabelle. Ein Typ, den andere Teile des Spiels eigenständig verwenden, verdient eine eigene Datei und class_name.

challenge icon

Aufgabe

Einfach

Erstelle eine Leaderboard, deren Einträge eine innere Klasse sind.

  • Deklariere die innere Klasse Entry innerhalb von Leaderboard, mit player_name und score, die von ihrem Konstruktor festgelegt werden, und _to_string(), das Ada: 120 zurückgibt.
  • entries ist ein typisiertes Array von Entry-Einträgen, in der Reihenfolge, in der die Spieler zum ersten Mal erscheinen.
  • submit(player, score) fügt für einen neuen Spieler einen neuen Eintrag hinzu. Für einen Spieler, der bereits einen Eintrag hat, wird der höhere der beiden Punktestände beibehalten.
  • best() gibt den Eintrag mit dem höchsten Punktestand zurück. Bei Gleichstand gewinnt der Eintrag, der zuerst erscheint.

Der bereitgestellte Code liest ein, wie viele Punktestände folgen (Ada 120), übermittelt sie und gibt anschließend jeden Eintrag sowie den besten aus (mindestens ein Punktestand ist immer gegeben). Für Ada 120, Bo 90, Ada 80, Bo 150, Cy 150 gibt er Folgendes aus:

Ada: 120
Bo: 150
Cy: 150
Best: Bo: 150

Dein Code gehört in leaderboard.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 board := Leaderboard.new()
	var count := int(OS.read_string_from_stdin())
	for i in count:
		var parts := OS.read_string_from_stdin().split(" ")
		board.submit(parts[0], int(parts[1]))
	for entry in board.entries:
		print(entry)
	print("Best: ", board.best())
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