Membres publics et privés
Fait partie de la section Programmation orientée objet du Journey GDScript de Coddy. Leçon 26 sur 65.
L’encapsulation signifie qu’un objet regroupe ses données et les méthodes qui les modifient, et décide quels membres de l’objet les autres codes peuvent utiliser. Les membres destinés aux autres codes constituent l’interface de l’objet.
GDScript n’a pas de mot-clé public ou private : chaque membre est accessible de l’extérieur. Le guide de style de Godot marque les membres privés avec un trait de soulignement initial :
# bank_account.gd
class_name BankAccount
extends RefCounted
var owner_name: String
var _balance: int = 0
var _history: Array[String] = []
func _init(holder: String) -> void:
owner_name = holder
func deposit(amount: int) -> void:
_balance += amount
_record("deposit %d" % amount)
func get_balance() -> int:
return _balance
func _record(entry: String) -> void:
_history.append(entry)owner_name, deposit() et get_balance() sont publics, donc main.gd les utilise. _balance, _history et _record() sont privés : seul le code à l’intérieur de bank_account.gd les utilise.
# main.gd
var account := BankAccount.new("Ada")
account.deposit(50)
account.deposit(20)
print(account.owner_name) # Ada
print(account.get_balance()) # 70Le trait de soulignement est une convention, pas un verrou : account._balance = 1000000 dans main.gd s’exécute sans aucune erreur. Respecte quand même la convention. Si seule la classe modifie _balance, un solde erroné ne peut provenir que d’une méthode dans bank_account.gd ; c’est donc le seul fichier que tu dois vérifier.
GDScript n’a pas non plus de niveau protected. Une sous-classe hérite de tous les membres, y compris les membres privés. Ainsi, une SavingsAccount qui extends BankAccount peut utiliser _balance dans ses propres méthodes.
Les méthodes virtuelles de Godot, telles que _init() et _ready(), commencent également par un trait de soulignement. Godot les appelle pour toi, alors ne donne jamais le même nom à l’une de tes méthodes privées.
Défi
FacileTermine la classe Hero dans hero.gd. Ses membres publics sont hero_name, gain_xp(), get_xp() et get_level(). Le reste est privé :
- Ajoute les variables privées
_xp(initialisée à0) et_level(initialisée à1). - Ajoute la méthode privée
_update_level(), qui définit_levelà1 + _xp / 100(division entière). gain_xp(amount)ajouteamountà_xp, appelle_update_level()et renvoietruesi le niveau a augmenté, etfalsesinon.get_xp()etget_level()renvoient les valeurs privées.
Le code fourni lit le nom du héros, puis le nombre de quantités d’XP qui suivent, puis une quantité par ligne. Après chaque quantité, il affiche une ligne Level up! lorsque gain_xp() renvoie true, puis l’état du héros. Pour Ada et les quantités 40, 70 et 250, il affiche :
Ada: 40 XP, level 1
Level up! Ada is now level 2
Ada: 110 XP, level 2
Level up! Ada is now level 4
Ada: 360 XP, level 4Ton code va dans hero.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 : ne le modifiez pas
var hero := Hero.new(OS.read_string_from_stdin())
var count := int(OS.read_string_from_stdin())
for i in count:
var amount := int(OS.read_string_from_stdin())
if hero.gain_xp(amount):
print("Level up! %s is now level %d" % [hero.hero_name, hero.get_level()])
print("%s: %d XP, level %d" % [hero.hero_name, hero.get_xp(), hero.get_level()])
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