Menu
CoddyTech

Methodenüberschreibung

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

Ein Kind überschreibt eine Methode, indem es eine Methode mit demselben Namen definiert. Objekte der Kindklasse führen dann die Version des Kindes aus, und die Methoden, die es nicht überschreibt, werden weiterhin unverändert geerbt.

# animal.gd
class_name Animal
extends RefCounted

var animal_name: String

func _init(n: String) -> void:
	animal_name = n

func make_sound() -> void:
	print("Some generic animal sound")

func info() -> void:
	print("I am ", animal_name)
# dog.gd
class_name Dog
extends Animal

func make_sound() -> void:
	print("Woof! Woof!")
var animal := Animal.new("Generic")
var dog := Dog.new("Buddy")
animal.make_sound()
dog.make_sound()
dog.info()
Some generic animal sound
Woof! Woof!
I am Buddy

Die Überschreibung muss die Signatur der Elternklasse beibehalten: dieselben Parameter und denselben Rückgabetyp. Mit einer anderen Signatur startet das Programm nicht:

# animal.gd
func speak(times: int) -> String:
	return "...".repeat(times)
# dog.gd
func speak() -> String:
	return "Woof"
Parse Error: The function signature doesn't match the parent. Parent signature is "speak(int) -> String".

Die Version des Kinds wird auch dann ausgeführt, wenn der Aufruf aus einer Methode der Elternklasse stammt. Hier existiert introduce() nur in Animal, und die Methode ruft sound() auf, das von Cat überschrieben wird:

# animal.gd
func sound() -> String:
	return "..."

func introduce() -> String:
	return animal_name + " says " + sound()
# cat.gd
func sound() -> String:
	return "Meow"
print(Cat.new("Tom").introduce())
Tom says Meow

Variablen können nicht überschrieben werden: var animal_name erneut in Dog zu deklarieren, ist ein Parsefehler (The member "animal_name" already exists in parent class Animal). Um einem Kind einen anderen Anfangswert zu geben, weise ihn im _init() des Kindes zu.

challenge icon

Aufgabe

Einfach

shape.gd enthält die fertige Klasse Shape: eine color, area(), die 0.0 zurückgibt, und describe(). Circle und Square erweitern sie und haben bereits ihre Konstruktoren. Überschreibe jeweils zwei Methoden:

  • Circle: area() gibt PI * radius * radius zurück, und describe() gibt This is a COLOR circle with radius R zurück.
  • Square: area() gibt side * side zurück, und describe() gibt This is a COLOR square with side S zurück.

Behalte die Signaturen der Elternklasse bei: func area() -> float und func describe() -> String.

Der bereitgestellte Code liest ein, wie viele Formen folgen, dann eine Zeile pro Form: shape COLOR, circle COLOR RADIUS oder square COLOR SIDE. Er gibt describe() und die Fläche mit zwei Dezimalstellen aus. Für circle red 5 und shape green gibt er Folgendes aus:

This is a red circle with radius 5
Area: 78.54
This is a green shape
Area: 0.00

Dein Code kommt in circle.gd und square.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(" ")
		var shape: Shape
		if parts[0] == "circle":
			shape = Circle.new(parts[1], int(parts[2]))
		elif parts[0] == "square":
			shape = Square.new(parts[1], int(parts[2]))
		else:
			shape = Shape.new(parts[1])
		print(shape.describe())
		print("Area: %.2f" % shape.area())
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