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 slotW 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.
Wyzwanie
ŁatwyZbuduj Leaderboard, którego wpisy są klasą wewnętrzną.
- Zadeklaruj klasę wewnętrzną
EntrywewnątrzLeaderboard, z polamiplayer_nameiscoreustawianymi przez jej konstruktor oraz metodą_to_string(), która zwracaAda: 120. entriesto typowana tablica elementówEntry, 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: 150Umieść 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())
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