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.
Sfida
FacileUn garage gestisce ogni veicolo tramite un unico Array[Vehicle]. In vehicle.gd, wheels() restituisce 0 e sound() restituisce ....
- Scrivi
describe()inVehicle. RestituisceBRAND: N wheels, SOUND, chiamandowheels()esound(). Carsovrascrivewheels()con4esound()conVroom.Motorcycleli sovrascrive con2eBrrm.Truckmemorizza già il numero ditrailers. Sovrascrivewheels()con6più4per ogni rimorchio, esound()conHonk.
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: 18Il 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)
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
1Fondamenti della programmazione orientata agli oggetti
File esterniIntroduzione alla programmazione orientata agli oggettiClassi e oggetti a confrontoLa parola chiave selfMetodiProprietàCostruttore (_init)Riepilogo - Calcolatrice semplice4Polimorfismo
Ripasso dell'override dei metodiDuck typingClassi e metodi astrattiProgettazione delle interfacceRiepilogo - Calcolatore di forme7Segnali
Che cos'è un segnale?Dichiarare ed emettereCollegarsi ai segnaliSegnali con argomentiRipasso - Sistema della salute10Pattern di progettazione, parte 2
Pattern CommandPattern AdapterPattern DecoratorPattern Template MethodPattern StatePattern Composite2Proprietà delle classi
Variabili di istanza e staticheFunzioni staticheSetter delle proprietàGetter delle proprietàPrivato per convenzioneRiepilogo - Gestore di conti bancari5Incapsulamento
Membri pubblici e privatiValidazione con i setterNascondimento delle informazioniProprietà di sola letturaRiepilogo - Sistema di gestione dei dati degli studenti8Concetti avanzati di OOP
Composizione vs ereditarietàClassi interneNodi come componentiRefCounted vs NodeEnum nelle classi11Progetto: Gestione della biblioteca
Panoramica del progettoClassi Libro e Utente3Ereditarietà
Ereditarietà di baseLa parola chiave superOverride dei metodiCatene di ereditarietàControlli di tipo con isRipasso - Gerarchia dei dipendenti6Metodi speciali
Introduzione ai metodi virtualiIl metodo _to_stringIteratori personalizzatiRiepilogo - Lista personalizzata9Modelli di progettazione, parte 1
Introduzione ai modelli di progettazionePattern SingletonPattern FactoryPattern ObserverPattern StrategyEsercitati da solo: Compilatore GDScript online