Redéfinition de méthodes
Fait partie de la section Programmation orientée objet du Journey GDScript de Coddy. Leçon 17 sur 65.
Un enfant redéfinit une méthode en définissant une méthode portant le même nom. Les objets de la classe enfant exécutent alors la version de l’enfant, et les méthodes qu’elle ne redéfinit pas restent héritées sans modification.
# 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 BuddyLa redéfinition doit conserver la signature du parent : les mêmes paramètres et le même type de retour. Avec une signature différente, le programme ne démarre pas :
# 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 version de l’enfant s’exécute même lorsque l’appel provient d’une méthode du parent. Ici, introduce() existe uniquement dans Animal, et elle appelle sound(), que Cat redéfinit :
# 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 MeowLes variables ne peuvent pas être redéfinies : déclarer à nouveau var animal_name dans Dog provoque une erreur d’analyse (The member "animal_name" already exists in parent class Animal). Pour donner une valeur initiale différente à une classe enfant, attribuez-la dans son _init().
Défi
Facileshape.gd contient la classe Shape terminée : une color, area() qui renvoie 0.0 et describe(). Circle et Square en héritent et ont déjà leurs constructeurs. Redéfinissez deux méthodes dans chacune :
Circle:area()renvoiePI * radius * radius, etdescribe()renvoieThis is a COLOR circle with radius R.Square:area()renvoieside * side, etdescribe()renvoieThis is a COLOR square with side S.
Conservez les signatures de la classe parente : func area() -> float et func describe() -> String.
Le code fourni lit le nombre de formes qui suivent, puis une ligne par forme : shape COLOR, circle COLOR RADIUS ou square COLOR SIDE. Il affiche describe() et l’aire avec deux décimales. Pour circle red 5 et shape green, il affiche :
This is a red circle with radius 5
Area: 78.54
This is a green shape
Area: 0.00Votre code va dans circle.gd et square.gd. main.gd contient le code d’entrée/sortie fourni et ne peut pas être modifié.
Essayez vous-même
extends Node
func _ready():
# Code d'entrée/sortie fourni : conservez-le tel quel
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())
Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.
Toutes les leçons de Programmation orientée objet
1Fondamentaux de la POO
Fichiers externesIntroduction à la POOClasses et objetsLe mot-clé selfMéthodesPropriétésConstructeur (_init)Récapitulatif - Calculatrice simple4Polymorphisme
Retour sur la redéfinition des méthodesTypage canardClasses et méthodes abstraitesConception d’interfacesRécapitulatif – Calculateur de formes7Signaux
Qu’est-ce qu’un signal ?Déclarer et émettreSe connecter aux signauxSignaux avec argumentsRécapitulatif - système de santé10Patrons de conception, partie 2
Patron CommandePatron AdaptateurPatron DécorateurPatron Méthode modèlePatron ÉtatPatron Composite2Propriétés de classe
Variables d’instance et variables statiquesFonctions statiquesSetters de propriétésGetters de propriétésPrivé par conventionRécapitulatif - Gestionnaire de comptes bancaires5Encapsulation
Membres publics et privésValidation avec les méthodes setterMasquage de l’informationPropriétés en lecture seuleRécapitulatif - Système de dossiers étudiants8Concepts avancés de la POO
Composition ou héritageClasses internesLes nœuds comme composantsRefCounted ou NodeEnums dans les classes3Héritage
Héritage de baseLe mot-clé superRedéfinition de méthodesChaînes d’héritageVérifier les types avec isRécapitulatif – Hiérarchie des employés6Méthodes spéciales
Introduction aux méthodes virtuellesLa méthode _to_stringItérateurs personnalisésRécapitulatif – Liste personnalisée9Patrons de conception, partie 1
Introduction aux patrons de conceptionPatron SingletonPatron FactoryPatron ObserverPatron StrategyEntraînez-vous par vous-même : Compilateur GDScript en ligne