Menu
CoddyTech

Klasy wewnętrzne

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

Klasa może zadeklarować wewnątrz siebie inną klasę za pomocą słowa kluczowego class, nazwy i wciętego bloku. Ta klasa wewnętrzna jest pomocniczym typem należącym do klasy zewnętrznej:

# 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

W pliku inventory.gd klasa wewnętrzna to Slot. Każdy inny plik odwołuje się do niej przez klasę zewnętrzną: 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)

Klasa wewnętrzna bez extends dziedziczy po RefCounted i może mieć zmienne, konstruktor oraz metody, tak jak każda klasa. Może korzystać ze stałych i typów wyliczeniowych klasy zewnętrznej (powyżej MAX_STACK), ale nie z jej zmiennych składowych: Slot nie ma dostępu do slots, ponieważ slot jest osobnym obiektem. Przekaż jej w konstruktorze każdą potrzebną wartość.

Użyj klasy wewnętrznej dla małego typu, który ma sens tylko w połączeniu z klasą zewnętrzną, na przykład miejsca w ekwipunku lub wpisu w tabeli wyników. Typ, którego inne części gry używają samodzielnie, zasługuje na własny plik i class_name.

challenge icon

Wyzwanie

Łatwy

Zbuduj Leaderboard, którego wpisy są klasą wewnętrzną.

  • Zadeklaruj klasę wewnętrzną Entry wewnątrz Leaderboard, z polami player_name i score ustawianymi przez jej konstruktor oraz metodą _to_string(), która zwraca Ada: 120.
  • entries to typowana tablica elementów Entry, uporządkowanych według kolejności pierwszego pojawienia się graczy.
  • submit(player, score) dodaje nowy wpis dla nowego gracza. Jeśli gracz ma już wpis, zachowuje wyższy z dwóch wyników.
  • best() zwraca wpis z najwyższym wynikiem. W przypadku remisu wygrywa wpis, który pojawia się jako pierwszy.

Dostarczony kod odczytuje, ile wyników podano (Ada 120), przesyła je, a następnie wyświetla każdy wpis i najlepszy z nich (zawsze podany jest co najmniej jeden wynik). Dla Ada 120, Bo 90, Ada 80, Bo 150, Cy 150 wyświetla:

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

Umieść swój kod w pliku leaderboard.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 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 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