Menu
CoddyTech

Das Schlüsselwort super

Teil des Abschnitts Objektorientierte Programmierung der GDScript-Journey von Coddy. Lektion 16 von 65.

Wenn ein Kind zusätzliche Daten benötigt, schreibt es sein eigenes _init(). Der Konstruktor des Elternteils wird dann nicht mehr automatisch ausgeführt. Rufe ihn mit super() auf und übergib die Argumente, die das Elternteil erwartet:

# 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

Ohne die Zeile super(n) läuft das Programm weiterhin, aber der Konstruktor von Animal wird übersprungen: Nichts setzt animal_name, daher bleibt es ein leerer String. Setze super() an den Anfang, damit die Variablen der Elternklasse bereit sind, bevor die Unterklasse sie verwendet.

In jeder anderen Methode führt super() die Version der Methode der Elternklasse aus, in der du dich gerade befindest. Das Kind behält das Ergebnis der Elternklasse bei und ergänzt es:

# 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

Um eine andere Methode der Elternklasse aufzurufen, schreibe ihren Namen nach einem Punkt: super.describe() funktioniert in jeder Methode von Dog.

challenge icon

Aufgabe

Einfach

Schreibe eine Person-Klasse und eine Employee-Klasse, die von ihr erbt.

  • Person speichert person_name und age in seinem Konstruktor. introduce() gibt Hi, I'm NAME and I'm AGE years old zurück.
  • Employee fügt job hinzu. Sein Konstruktor übergibt den Namen und das Alter an super() und speichert den Beruf. introduce() gibt das Ergebnis der introduce()-Methode der Elternklasse gefolgt von . I work as a JOB zurück.

Der bereitgestellte Code liest ein, wie viele Personen folgen, und danach eine Zeile pro Person: person NAME AGE oder employee NAME AGE JOB. Er gibt für jede Person introduce() aus. Für person Alice 30 und employee Bob 35 Developer gibt er Folgendes aus:

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

Dein Code gehört in person.gd und employee.gd. main.gd enthält den bereitgestellten Ein-/Ausgabecode und kann nicht bearbeitet werden.

Probier es selbst

extends Node

func _ready():
	# Vorgegebener Ein-/Ausgabecode: unverändert lassen
	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 iconTeste dich selbst

Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.

Alle Lektionen in Objektorientierte Programmierung

Übe selbstständig: Online-GDScript-Compiler