Menu
CoddyTech

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 Beagle

Sin 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 " + breed
var rex := Dog.new("Rex", "Husky")
print(rex.describe())
Animal created: Rex
Dog breed set: Husky
I am Rex, a Husky

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

challenge icon

Desafío

Fácil

Escribe una clase Person y una clase Employee que herede de ella.

  • Person almacena person_name y age en su constructor. introduce() devuelve Hi, I'm NAME and I'm AGE years old.
  • Employee añade job. Su constructor pasa el nombre y la edad a super() y almacena el trabajo. Su método introduce() devuelve el resultado del método introduce() 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 Developer

Tu 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())
quiz iconPonte a prueba

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

Practica por tu cuenta: Compilador de GDScript online