Menu
CoddyTech

Ripasso dell'override dei metodi

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

Il polimorfismo significa «molte forme»: una chiamata a un metodo fa cose diverse a seconda della classe dell'oggetto che la riceve. È l'override a renderlo possibile.

# animal.gd
class_name Animal
extends RefCounted

func speak() -> String:
	return "..."
# dog.gd
class_name Dog
extends Animal

func speak() -> String:
	return "Woof!"
# cat.gd
class_name Cat
extends Animal

func speak() -> String:
	return "Meow!"

Un Array[Animal] può contenerli tutti. Il ciclo chiama speak() senza sapere a quale classe appartiene ogni elemento, e ogni oggetto risponde con la propria versione:

var animals: Array[Animal] = [Dog.new(), Cat.new(), Animal.new()]
for animal in animals:
	print(animal.speak())
Woof!
Meow!
...

Una funzione con un parametro Animal funziona allo stesso modo. Accetta tutte le classi figlie, incluse quelle che aggiungerai in seguito, senza modifiche:

func make_it_speak(animal: Animal) -> void:
	print("It says ", animal.speak())
make_it_speak(Cat.new())
It says Meow!

Confronta questo con il controllo delle classi una per una. Una catena di rami if animal is Dog: deve crescere con ogni nuova classe. Con l’override, ogni classe porta con sé il proprio comportamento e il codice che lo richiama rimane invariato.

challenge icon

Sfida

Facile

Un garage gestisce ogni veicolo tramite un unico Array[Vehicle]. In vehicle.gd, wheels() restituisce 0 e sound() restituisce ....

  • Scrivi describe() in Vehicle. Restituisce BRAND: N wheels, SOUND, chiamando wheels() e sound().
  • Car sovrascrive wheels() con 4 e sound() con Vroom.
  • Motorcycle li sovrascrive con 2 e Brrm.
  • Truck memorizza già il numero di trailers. Sovrascrive wheels() con 6 più 4 per ogni rimorchio, e sound() con Honk.

Le classi figlie non sovrascrivono describe(). Il codice fornito legge quanti veicoli seguono, poi una riga per ogni veicolo: car BRAND, motorcycle BRAND, truck BRAND TRAILERS oppure vehicle BRAND. Stampa ogni describe() e il totale di wheels(). Per car Toyota e truck Volvo 2 stampa:

Toyota: 4 wheels, Vroom
Volvo: 14 wheels, Honk
Total wheels: 18

Il tuo codice va in vehicle.gd, car.gd, motorcycle.gd e truck.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())
	var vehicles: Array[Vehicle] = []
	for i in count:
		var p := OS.read_string_from_stdin().split(" ")
		if p[0] == "car":
			vehicles.append(Car.new(p[1]))
		elif p[0] == "motorcycle":
			vehicles.append(Motorcycle.new(p[1]))
		elif p[0] == "truck":
			vehicles.append(Truck.new(p[1], int(p[2])))
		else:
			vehicles.append(Vehicle.new(p[1]))
	var total := 0
	for v in vehicles:
		print(v.describe())
		total += v.wheels()
	print("Total wheels: %d" % total)
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