Constructor (_init)
Parte de la sección Programación orientada a objetos del Journey de GDScript de Coddy. Lección 7 de 65.
Establecer cada propiedad después de new() requiere varias líneas, y es fácil olvidar alguna. Un constructor prepara un objeto cuando se crea. En GDScript, el constructor es el método _init():
# book.gd
class_name Book
extends RefCounted
var title: String
var author: String
var pages: int
func _init(book_title: String, book_author: String, page_count: int) -> void:
title = book_title
author = book_author
pages = page_countLos argumentos que pasas a new() se pasan a _init(), que se ejecuta automáticamente antes de que new() devuelva el objeto:
var dune := Book.new("Dune", "Frank Herbert", 412)
print(dune.title) # Dune
print(dune.pages) # 412Cuando _init() tiene parámetros, new() debe pasárselos: Book.new() sin argumentos es un error que se notifica antes de que se ejecute el programa. Un parámetro con un valor predeterminado es opcional:
func _init(book_title: String, book_author: String = "Unknown") -> void:Con este constructor, Book.new("Notes") crea un libro cuyo autor es "Unknown".
Los nombres de los parámetros de arriba difieren de los nombres de las propiedades. Si fueran iguales, escribirías self.title = title, como en la lección sobre self.
Desafío
FácilCompleta la clase Book en book.gd:
- el constructor
_init(book_title, book_author, page_count)almacena sus argumentos en las propiedadestitle,authorypages describe()devuelve'TITLE' by AUTHOR, PAGES pages, con el título entre comillas simples
El código proporcionado lee cuántos libros vienen a continuación y luego una línea por libro con el título, el autor y el número de páginas separados por ;. Crea cada libro con Book.new(), imprime describe() y, finalmente, imprime el total de las propiedades pages. Para la línea Dune;Frank Herbert;412, imprime:
'Dune' by Frank Herbert, 412 pages
Total pages: 412Tu código va en book.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: déjalo tal como está
var count := int(OS.read_string_from_stdin())
var total := 0
for i in count:
var parts := OS.read_string_from_stdin().split(";")
var book := Book.new(parts[0], parts[1], int(parts[2]))
print(book.describe())
total += book.pages
print("Total pages: %d" % total)
Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
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