Revisão - Lista personalizada
Parte da seção Programação orientada a objetos do Journey de GDScript da Coddy. Lição 34 de 65.
Desafio
MédioEscreva CustomList em custom_list.gd, uma classe que encapsula um Array privado _items e oferece o que uma lista precisa por meio de métodos e métodos virtuais:
_init(items = [])armazena uma cópia deitems, para que alterações posteriores no Array passado não afetem a lista.append(item)adiciona um item ao final.pop_back()remove e retorna o último item, ou retornanullquando a lista está vazia.get_at(index)retorna o item, ounullquando o índice está fora do intervalo de0asize() - 1.set_at(index, value)substitui o item e retornatrue, ou retornafalsepara um índice fora da lista.size(),has(item)eclear()funcionam como os métodos de Array com os mesmos nomes.concat(other)substitui o operador+: retorna uma novaCustomListcom os itens desta lista seguidos pelos itens deother, sem alterar nenhuma das listas._to_string()retorna os itens como um Array os exibe, como[3, 1, 4]._iter_init(),_iter_next()e_iter_get()permitem que um loopforpercorra os itens.
O código fornecido lê os números iniciais (uma linha, separados por espaços, possivelmente vazia), cria a lista, adiciona 99 ao Array passado e exibe a lista. Em seguida, lê o número de comandos e executa um por linha: append N, pop, get I, set I N, has N, size, sum (um loop for sobre a lista), clear e concat N N .... Para esta entrada:
3 1 4
8
append 1
get 2
get 9
set 0 5
has 4
sum
pop
concat 9 2ele exibe:
[3, 1, 4]
[3, 1, 4, 1]
Item 2: 4
No item at 9
[5, 1, 4, 1]
Has 4: true
Sum: 11
Popped 1
[5, 1, 4] + [9, 2] = [5, 1, 4, 9, 2]Seu código deve ficar em custom_list.gd. main.gd contém o código fornecido de entrada/saída 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 numbers := to_numbers(OS.read_string_from_stdin().split(" ", false))
var list := CustomList.new(numbers)
# A lista deve manter sua própria cópia
numbers.append(99)
print(list)
var count := int(OS.read_string_from_stdin())
for i in count:
var parts := OS.read_string_from_stdin().split(" ", false)
match parts[0]:
"append":
list.append(int(parts[1]))
print(list)
"pop":
var item = list.pop_back()
print("Empty" if item == null else "Popped %d" % item)
"get":
var item = list.get_at(int(parts[1]))
print(("No item at " + parts[1]) if item == null else "Item %s: %d" % [parts[1], item])
"set":
if list.set_at(int(parts[1]), int(parts[2])):
print(list)
else:
print("No item at " + parts[1])
"has":
print("Has %s: %s" % [parts[1], list.has(int(parts[1]))])
"size":
print("Size: %d" % list.size())
"sum":
var total := 0
for item in list:
total += item
print("Sum: %d" % total)
"clear":
list.clear()
print(list)
"concat":
var other := CustomList.new(to_numbers(parts.slice(1)))
print("%s + %s = %s" % [list, other, list.concat(other)])
func to_numbers(words: PackedStringArray) -> Array:
var result := []
for word in words:
result.append(int(word))
return result
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