Menu
CoddyTech

Chaînes d’héritage

Fait partie de la section Programmation orientée objet du Journey GDScript de Coddy. Leçon 18 sur 65.

Une classe enfant peut elle-même être un parent. Chaque extends ajoute un niveau à une chaîne d’héritage :

# vehicle.gd
class_name Vehicle
extends RefCounted

var wheels: int

func _init(w: int) -> void:
	wheels = w

func describe() -> String:
	return "%d wheels" % wheels
# car.gd
class_name Car
extends Vehicle

func _init() -> void:
	super(4)

func describe() -> String:
	return "Car with " + super()
# race_car.gd
class_name RaceCar
extends Car

var top_speed: int

func _init(speed: int) -> void:
	super()
	top_speed = speed

func describe() -> String:
	return super() + ", top speed %d" % top_speed

RaceCar a tout ce qui vient de Car et de Vehicle. Chaque super() remonte d’un niveau, donc un appel exécute les trois versions de describe() :

print(RaceCar.new(300).describe())
Car with 4 wheels, top speed 300

Lorsque tu appelles une méthode ou lis une variable, Godot cherche d’abord dans la classe propre de l’objet, puis dans sa classe parente, puis dans la classe parente de celle-ci, et utilise la première qu’il trouve. RaceCar.new(300).wheels se trouve dans Vehicle, deux niveaux plus haut.

Chaque classe a exactement un parent. extends prend une seule classe, et en en indiquant deux, on obtient une erreur d’analyse :

class_name FlyingCar
extends Car, Plane
Parse Error: Expected end of statement after superclass, found "," instead.

GDScript ne prend pas en charge l’héritage multiple. Lorsqu’une classe a besoin des fonctionnalités de deux classes, place-les sur une même chaîne, ou donne-lui un objet de l’autre classe avec lequel travailler (un chapitre ultérieur abordera ce sujet).

challenge icon

Défi

Facile

character.gd contient la classe Character achevée : un nom, hp, describe() qui renvoie NAME (HP HP) et attack() qui renvoie 1. Construis deux niveaux supplémentaires à partir de celle-ci :

  • Warrior étend Character et ajoute strength. Son constructeur transmet le nom et hp à super(). describe() ajoute , strength S au texte de la classe parente, et attack() renvoie la force.
  • Knight étend Warrior et ajoute armor. Son constructeur transmet le nom, hp et strength à super(). describe() ajoute , armor A au texte de Warrior, et attack() renvoie l’attaque de Warrior plus 5.

Le code fourni lit le nombre de personnages qui suivent, puis une ligne par personnage : character NAME HP, warrior NAME HP STRENGTH ou knight NAME HP STRENGTH ARMOR. Il affiche describe() et l’attaque. Pour knight Arthur 120 15 8, il affiche :

Arthur (120 HP), strength 15, armor 8
Attack: 20

Ton code doit être placé dans warrior.gd et knight.gd. main.gd contient le code fourni pour l’entrée et la sortie 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 p := OS.read_string_from_stdin().split(" ")
		var c: Character
		if p[0] == "knight":
			c = Knight.new(p[1], int(p[2]), int(p[3]), int(p[4]))
		elif p[0] == "warrior":
			c = Warrior.new(p[1], int(p[2]), int(p[3]))
		else:
			c = Character.new(p[1], int(p[2]))
		print(c.describe())
		print("Attack: %d" % c.attack())
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