Tu trouveras des infos (en anglais) sur
protected ici mais aussi
iciQuand tu utilises ce mot-clé devant une déclaration de variable dans
struct, ça fait que la variable en question peut être accédée uniquement depuis l'intérieur d'une méthode de cette structure, via le mot-clé
this. Par exemple, si tu as une instance de Personnage nommée mettons
raoul, tu pourras pas faire simplement
Display("Raoul a %d blessure", raoul.blessure); : ça déclenchera une erreur, parce que tu y accèdes via
raoul dans la commande
Display, qui se trouve (probablement) dans un environnement qui n'est pas une méthode de la structure Personnage. De même, tu peux pas essayer de faire
raoul.blessure = 0; dans l'espoir d'annuler les blessures, puisque la variable est protégée en lecture aussi bien qu'en écriture : la seule façon de faire ce serait d'utiliser
this.blessure = 0; dans un environnement où
this renvoie bien à l'instance, c'est-à-dire dans une méthode de la structure Personnage
Note que le mot-clé
writeprotected est un peu plus libéral : si tu avais utilisé
writeprotected à la place de
protected dans le code de ton message, AGS te laisserait faire
Display("Raoul a %d blessure", raoul.blessure); (accès à la variable en lecture, ce qui est autorisé par
writeprotected) mais continuerait de t'empêcher de faire
raoul.blessure = 0; (accès en écriture, toujours pas autorisé par
writeprotected)
Les préfixes
get_ et
set_ dans les noms de méthodes vont de paire avec les mot-clés
import attribute, comme expliqué dans la page "Object Oriented Programming" dont j'ai donné le lien plus haut. Ça permet de définir des attributs auxquels tu pourras référer comme tu réfèrerais à des variables (non-protégées) d'une instance de structure (donc par exemple
Display("Raoul a %d blessure", raoul.Blessure); ou encore
raoul.Blessure = 0; -- cette fois avec une majuscule) alors qu'en réalité le programme exécute une fonction dans ces cas là. Autrement dit, les exemples que je viens de donner sont équivalents à
Display("Raoul a %d blessure", raoul.get_Blessure()); et
raoul.set_Blessure(0);. Ça peut paraître inutilement compliqué, mais c'est utile notamment pour empêcher par exemple qu'un attribut puisse avoir une valeur négative : en ajoutant quelque chose comme
if (_blessure < 0) this.blessure=0; dans
set_Blessure, tu peux t'assurer que
get_Blessure (et donc par conséquent
raoul.Blessure) ne retournera jamais de valeur négative, puisque
get_Blessure retourne la valeur de la variable
blessure, qui est protégée en écriture et uniquement définie dans
set_Blessure à une valeur toujours (null ou) positive
Enfin, les commentaires spéciaux
$AUTOCOMPLETEIGNORE$ ont pour effet de
garder le nom de l'élément importé hors de l'autocomplétion lorsque tu tapes du code dans une fenêtre de script. Puisqu'on se donne le mal de créer un attribut
Blessure utilisable comme une simple variable (alors qu'en réalité on exécute les fonctions
get_Blessure et
set_Blessure sous le capot) ce serait con d'encourager le programmeur à malgré tout utiliser les fonctions en faisant apparaître leur nom dans l'autocomplétion, en plus de créer de la redondance