Retour sur la redéfinition des méthodes
Fait partie de la section Programmation orientée objet du Journey GDScript de Coddy. Leçon 21 sur 65.
Le polymorphisme signifie « plusieurs formes » : un même appel de méthode produit des résultats différents selon la classe de l’objet qui le reçoit. La redéfinition permet cela.
# 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] peut tous les contenir. La boucle appelle speak() sans savoir de quelle classe est chaque élément, et chaque objet répond avec sa propre version :
var animals: Array[Animal] = [Dog.new(), Cat.new(), Animal.new()]
for animal in animals:
print(animal.speak())Woof!
Meow!
...Une fonction avec un paramètre Animal fonctionne de la même manière. Elle accepte toutes les classes dérivées, y compris celles que tu ajouteras plus tard, sans aucune modification :
func make_it_speak(animal: Animal) -> void:
print("It says ", animal.speak())make_it_speak(Cat.new())It says Meow!Comparez cela à la vérification des classes une par une. Une chaîne de branches if animal is Dog: doit s’allonger à chaque nouvelle classe. Avec la redéfinition, chaque classe porte son propre comportement, et le code qui l’appelle reste le même.
Défi
FacileUn garage gère chaque véhicule au moyen d'un seul Array[Vehicle]. Dans vehicle.gd, wheels() renvoie 0 et sound() renvoie ....
- Écrivez
describe()dansVehicle. Cette méthode renvoieBRAND: N wheels, SOUND, en appelantwheels()etsound(). Carredéfinitwheels()avec4etsound()avecVroom.Motorcycleles redéfinit avec2etBrrm.Truckstocke déjà son nombre detrailers. Il redéfinitwheels()avec6plus4par remorque, etsound()avecHonk.
Les classes enfants ne redéfinissent pas describe(). Le code fourni lit le nombre de véhicules qui suivent, puis une ligne par véhicule : car BRAND, motorcycle BRAND, truck BRAND TRAILERS ou vehicle BRAND. Il affiche chaque résultat de describe() ainsi que le total de wheels(). Pour car Toyota et truck Volvo 2, il affiche :
Toyota: 4 wheels, Vroom
Volvo: 14 wheels, Honk
Total wheels: 18Votre code doit être placé dans vehicle.gd, car.gd, motorcycle.gd et truck.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 : gardez-le tel quel
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)
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