Repaso: lista personalizada
Parte de la sección Programación orientada a objetos del Journey de GDScript de Coddy. Lección 34 de 65.
Desafío
IntermedioEscribe CustomList en custom_list.gd, una clase que envuelve un Array privado _items y ofrece lo que necesita una lista mediante métodos y métodos virtuales:
_init(items = [])guarda una copia deitems, para que los cambios posteriores en el Array pasado no afecten a la lista.append(item)añade un elemento al final.pop_back()elimina y devuelve el último elemento, o devuelvenullcuando la lista está vacía.get_at(index)devuelve el elemento, onullcuando el índice está fuera del rango de0asize() - 1.set_at(index, value)reemplaza el elemento y devuelvetrue, o devuelvefalsesi el índice está fuera de la lista.size(),has(item)yclear()funcionan como los métodos de Array con los mismos nombres.concat(other)sustituye al operador+: devuelve un nuevoCustomListcon los elementos de esta lista seguidos por los elementos deother, y no modifica ninguna de las dos listas._to_string()devuelve los elementos tal como los imprime un Array, por ejemplo[3, 1, 4]._iter_init(),_iter_next()y_iter_get()permiten que un bucleforrecorra los elementos.
El código proporcionado lee los números iniciales (una línea, separados por espacios, posiblemente vacía), crea la lista, añade 99 al Array que le pasó y la imprime. Después lee la cantidad de comandos y ejecuta uno por línea: append N, pop, get I, set I N, has N, size, sum (un bucle for sobre la lista), clear y 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 2imprime:
[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]Tu código va en custom_list.gd. main.gd contiene el código de entrada/salida proporcionado y no se puede editar.
Pruébalo tú mismo
extends Node
func _ready():
# Código de entrada/salida proporcionado: mantenlo tal como está
var numbers := to_numbers(OS.read_string_from_stdin().split(" ", false))
var list := CustomList.new(numbers)
# La lista debe conservar su propia copia
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 las lecciones de Programación orientada a objetos
1Fundamentos de la programación orientada a objetos
Archivos externosIntroducción a la programación orientada a objetosClases vs. objetosLa palabra clave selfMétodosPropiedadesConstructor (_init)Repaso: calculadora sencilla4Polimorfismo
Repaso de la sobrescritura de métodosTipado patoClases y métodos abstractosDiseño de interfacesRepaso: calculadora de formas7Señales
¿Qué es una señal?Declarar y emitirConectarse a las señalesSeñales con argumentosRepaso: sistema de salud10Patrones de diseño, parte 2
Patrón CommandPatrón AdapterPatrón DecoratorPatrón Template MethodPatrón StatePatrón Composite2Propiedades de clase
Variables de instancia y estáticasFunciones estáticasMétodos setter de propiedadesMétodos getter de propiedadesPrivado por convenciónRepaso: administrador de cuentas bancarias5Encapsulación
Miembros públicos y privadosValidación con settersOcultación de informaciónPropiedades de solo lecturaRepaso: sistema de registros de estudiantes8Conceptos avanzados de POO
Composición frente a herenciaClases internasNodos como componentesRefCounted frente a NodeEnums en clases3Herencia
Herencia básicaLa palabra clave superSobrescritura de métodosCadenas de herenciaComprobaciones de tipo con isRepaso: jerarquía de empleados6Métodos especiales
Introducción a los métodos virtualesEl método _to_stringIteradores personalizadosRepaso: lista personalizada9Patrones de diseño, parte 1
Introducción a los patrones de diseñoPatrón SingletonPatrón FactoryPatrón ObserverPatrón StrategyPractica por tu cuenta: Compilador de GDScript online