Menu
CoddyTech

Override dei metodi

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

Una classe figlia sovrascrive un metodo definendo un metodo con lo stesso nome. Gli oggetti della classe figlia eseguono quindi la versione della classe figlia, mentre i metodi che non sovrascrive vengono comunque ereditati senza modifiche.

# 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

L'override deve mantenere la firma del genitore: gli stessi parametri e lo stesso tipo restituito. Con una firma diversa, il programma non si avvia:

# 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".

La versione della classe figlia viene eseguita anche quando la chiamata proviene da un metodo della classe genitore. Qui introduce() esiste solo in Animal e chiama sound(), che Cat sovrascrive:

# 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

Le variabili non possono essere sovrascritte: dichiarare di nuovo var animal_name in Dog è un errore di analisi (The member "animal_name" already exists in parent class Animal). Per assegnare a una classe figlia un valore iniziale diverso, assegnalo nel suo _init().

challenge icon

Sfida

Facile

shape.gd contiene la classe Shape completa: un color, area() che restituisce 0.0 e describe(). Circle e Square la estendono e hanno già i costruttori. Esegui l'override di due metodi in ciascuna:

  • Circle: area() restituisce PI * radius * radius e describe() restituisce This is a COLOR circle with radius R.
  • Square: area() restituisce side * side e describe() restituisce This is a COLOR square with side S.

Mantieni le firme del genitore: func area() -> float e func describe() -> String.

Il codice fornito legge quante forme seguono, poi una riga per forma: shape COLOR, circle COLOR RADIUS o square COLOR SIDE. Stampa describe() e l'area con due decimali. Per circle red 5 e shape green stampa:

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

Il tuo codice va in circle.gd e square.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(" ")
		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 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