La palabra clave super
Parte de la sección Programación orientada a objetos del Journey de GDScript de Coddy. Lección 16 de 65.
Cuando un hijo necesita datos adicionales, escribe su propio _init(). El constructor del padre ya no se ejecuta por sí solo. Llámalo con super(), pasando los argumentos que espera el padre:
# animal.gd
class_name Animal
extends RefCounted
var animal_name: String
func _init(n: String) -> void:
animal_name = n
print("Animal created: ", n)# dog.gd
class_name Dog
extends Animal
var breed: String
func _init(n: String, b: String) -> void:
super(n)
breed = b
print("Dog breed set: ", b)var buddy := Dog.new("Buddy", "Beagle")
print(buddy.animal_name, " the ", buddy.breed)Animal created: Buddy
Dog breed set: Beagle
Buddy the BeagleSin la línea super(n), el programa sigue ejecutándose, pero se omite el constructor de Animal: nada establece animal_name, así que sigue siendo una cadena vacía. Coloca super() primero, para que las variables de la clase padre estén listas antes de que las use la clase hija.
En cualquier otro método, super() ejecuta la versión del método en el que estás de la clase padre. La clase hija conserva el resultado de la clase padre y le añade algo:
# animal.gd
func describe() -> String:
return "I am " + animal_name# dog.gd
func describe() -> String:
return super() + ", a " + breedvar rex := Dog.new("Rex", "Husky")
print(rex.describe())Animal created: Rex
Dog breed set: Husky
I am Rex, a HuskyPara llamar a otro método de la clase padre, escribe su nombre después de un punto: super.describe() funciona desde cualquier método de Dog.
Desafío
FácilEscribe una clase Person y una clase Employee que herede de ella.
Personalmacenaperson_nameyageen su constructor.introduce()devuelveHi, I'm NAME and I'm AGE years old.Employeeañadejob. Su constructor pasa el nombre y la edad asuper()y almacena el trabajo. Su métodointroduce()devuelve el resultado del métodointroduce()de la clase padre seguido de. I work as a JOB.
El código proporcionado lee cuántas personas vienen después y, luego, una línea por persona: person NAME AGE o employee NAME AGE JOB. Imprime introduce() para cada una. Para person Alice 30 y employee Bob 35 Developer, imprime:
Hi, I'm Alice and I'm 30 years old
Hi, I'm Bob and I'm 35 years old. I work as a DeveloperTu código va en person.gd y employee.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 count := int(OS.read_string_from_stdin())
for i in count:
var parts := OS.read_string_from_stdin().split(" ")
if parts[0] == "employee":
var employee := Employee.new(parts[1], int(parts[2]), parts[3])
print(employee.introduce())
else:
var person := Person.new(parts[1], int(parts[2]))
print(person.introduce())
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