Menu
CoddyTech

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 slot

Dentro 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.

challenge icon

Desafio

Fácil

Crie um Leaderboard cujas entradas sejam uma classe interna.

  • Declare a classe interna Entry dentro de Leaderboard, com player_name e score definidos pelo construtor, e _to_string() retornando Ada: 120.
  • entries é um array tipado de Entry, 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: 150

Seu 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())
quiz iconTeste seus conhecimentos

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

Pratique por conta própria: Compilador de GDScript online