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 BuddyL'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 MeowLe 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().
Sfida
Facileshape.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()restituiscePI * radius * radiusedescribe()restituisceThis is a COLOR circle with radius R.Square:area()restituisceside * sideedescribe()restituisceThis 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.00Il 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())
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