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_speedRaceCar 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 300Lorsque 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, PlaneParse 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).
Défi
Facilecharacter.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étendCharacteret ajoutestrength. Son constructeur transmet le nom et hp àsuper().describe()ajoute, strength Sau texte de la classe parente, etattack()renvoie la force.KnightétendWarrioret ajoutearmor. Son constructeur transmet le nom, hp et strength àsuper().describe()ajoute, armor Aau texte deWarrior, etattack()renvoie l’attaque deWarriorplus5.
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: 20Ton 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())
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