Menu
CoddyTech

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.

challenge icon

Défi

Facile

Un garage gère chaque véhicule au moyen d'un seul Array[Vehicle]. Dans vehicle.gd, wheels() renvoie 0 et sound() renvoie ....

  • Écrivez describe() dans Vehicle. Cette méthode renvoie BRAND: N wheels, SOUND, en appelant wheels() et sound().
  • Car redéfinit wheels() avec 4 et sound() avec Vroom.
  • Motorcycle les redéfinit avec 2 et Brrm.
  • Truck stocke déjà son nombre de trailers. Il redéfinit wheels() avec 6 plus 4 par remorque, et sound() avec Honk.

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: 18

Votre 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)
quiz iconTestez-vous

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

Entraînez-vous par vous-même : Compilateur GDScript en ligne