Menu
CoddyTech

La parola chiave super

Fa parte della sezione Programmazione orientata agli oggetti del percorso GDScript di Coddy. Lezione 16 di 65.

Quando un figlio ha bisogno di dati aggiuntivi, scrive il proprio _init(). Il costruttore del genitore quindi non viene più eseguito da solo. Chiamalo con super(), passando gli argomenti che il genitore si aspetta:

# 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

Senza la riga super(n) il programma continua a funzionare, ma il costruttore di Animal viene saltato: niente imposta animal_name, quindi rimane una String vuota. Inserisci super() per prima cosa, così le variabili del genitore sono pronte prima che il figlio le usi.

In qualsiasi altro metodo, super() esegue la versione del metodo della classe genitore in cui ti trovi. La classe figlia mantiene il risultato della classe genitore e vi aggiunge qualcosa:

# 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

Per chiamare un altro metodo della classe genitore, scrivi il suo nome dopo un punto: super.describe() funziona da qualsiasi metodo di Dog.

challenge icon

Sfida

Facile

Scrivi una classe Person e una classe Employee che la estende.

  • Person memorizza person_name e age nel suo costruttore. introduce() restituisce Hi, I'm NAME and I'm AGE years old.
  • Employee aggiunge job. Il suo costruttore passa il nome e l'età a super() e memorizza il lavoro. Il suo introduce() restituisce il risultato di introduce() della classe genitore seguito da . I work as a JOB.

Il codice fornito legge quante persone seguono, poi una riga per ogni persona: person NAME AGE oppure employee NAME AGE JOB. Stampa introduce() per ciascuna. Per person Alice 30 e employee Bob 35 Developer stampa:

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

Il tuo codice va in person.gd e employee.gd. main.gd contiene il codice di input/output fornito e non può essere modificato.

Provalo tu

extends Node

func _ready():
	# Codice di input/output fornito: lascialo così com'è
	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 iconMettiti alla prova

Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.

Tutte le lezioni di Programmazione orientata agli oggetti

Esercitati da solo: Compilatore GDScript online