Menu
CoddyTech

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 Buddy

La 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 Meow

Les 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().

challenge icon

Défi

Facile

shape.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() renvoie PI * radius * radius, et describe() renvoie This is a COLOR circle with radius R.
  • Square : area() renvoie side * side, et describe() renvoie This 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.00

Votre 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())
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