Classes Internas
Parte da seção Programação orientada a objetos do Journey de GDScript da Coddy. Lição 41 de 65.
Uma classe pode declarar outra classe dentro dela, com a palavra-chave class, um nome e um corpo indentado. Essa classe interna é um tipo auxiliar que pertence à classe externa:
# 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 slotDentro de inventory.gd, a classe interna é Slot. Todos os outros arquivos a acessam por meio da classe externa: 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)Uma classe interna sem extends estende RefCounted e pode ter variáveis, um construtor e métodos como qualquer classe. Ela pode usar as constantes e enumerações da classe externa (MAX_STACK acima), mas não suas variáveis-membro: Slot não tem acesso a slots, porque um slot é um objeto separado. Passe ao construtor qualquer valor de que ela precise.
Use uma classe interna para um tipo pequeno que só faz sentido junto com sua classe externa, como um espaço de um inventário ou uma entrada de uma tabela de pontuação. Um tipo que outras partes do jogo usam por conta própria merece seu próprio arquivo e class_name.
Desafio
FácilCrie um Leaderboard cujas entradas sejam uma classe interna.
- Declare a classe interna
Entrydentro deLeaderboard, complayer_nameescoredefinidos pelo construtor, e_to_string()retornandoAda: 120. entriesé um array tipado deEntry, na ordem em que os jogadores aparecem pela primeira vez.submit(player, score)adiciona uma nova entrada para um jogador novo. Para um jogador que já tem uma entrada, mantém a maior das duas pontuações.best()retorna a entrada com a maior pontuação. Em caso de empate, vence a entrada que aparece primeiro.
O código fornecido lê quantas pontuações vêm a seguir (Ada 120), envia-as e, em seguida, imprime todas as entradas e a melhor (sempre é fornecida pelo menos uma pontuação). Para Ada 120, Bo 90, Ada 80, Bo 150, Cy 150, ele imprime:
Ada: 120
Bo: 150
Cy: 150
Best: Bo: 150Seu código deve ficar em leaderboard.gd. main.gd contém o código de entrada/saída fornecido e não pode ser editado.
Experimente você mesmo
extends Node
func _ready():
# Código de entrada/saída fornecido: mantenha-o como está
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())
Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.
Todas as lições de Programação orientada a objetos
1Fundamentos da POO
Arquivos externosIntrodução à POOClasses vs. objetosA palavra-chave selfMétodosPropriedadesConstrutor (_init)Revisão - Calculadora simples4Polimorfismo
Revisitando a Sobrescrita de MétodosDuck TypingClasses e Métodos AbstratosDesign de InterfacesRevisão - Calculadora de Formas7Sinais
O que é um sinal?Declarando e emitindoConectando-se a sinaisSinais com argumentosRevisão - Sistema de saúde10Padrões de Projeto Parte 2
Padrão CommandPadrão AdapterPadrão DecoratorPadrão Template MethodPadrão StatePadrão Composite2Propriedades de Classe
Variáveis de Instância vs. EstáticasFunções EstáticasMétodos Setters de PropriedadeMétodos Getters de PropriedadePrivado por ConvençãoRecapitulando: Gerenciador de Conta Bancária5Encapsulamento
Membros públicos e privadosValidação com settersOcultação de informaçõesPropriedades somente para leituraRevisão - Sistema de registros de alunos8Conceitos Avançados de POO
Composição vs. HerançaClasses InternasNós como ComponentesRefCounted vs. NodeEnums em Classes3Herança
Herança básicaA palavra-chave superSobrescrita de métodosCadeias de herançaVerificações de tipo com isRevisão - Hierarquia de funcionários6Métodos especiais
Introdução aos métodos virtuaisO método _to_stringIteradores personalizadosRevisão - Lista personalizada9Padrões de Projeto Parte 1
Introdução aos Padrões de ProjetoPadrão SingletonPadrão FactoryPadrão ObserverPadrão StrategyPratique por conta própria: Compilador de GDScript online