Le constructeur
Quand construire est plus que copier des champs — du code qui court à la naissance.
La construction par champs nommés copie des valeurs, et c’est tout. Quand naître demande davantage — une valeur dérivée, un défaut qui n’est pas zéro, une règle à imposer — l’archetype déclare un constructeur.
archetype Potion {
nom: str;
doses: int;
constructor(nom: str) {
self.nom := nom;
self.doses := 3;
}
boire() {
if (self.doses = 0) {
Console.print(text: $"{self.nom} : le flacon est vide.");
return;
}
self.doses := self.doses - 1;
Console.print(text: $"{self.nom} : une dose de moins, il en reste {self.doses}.");
}
}
@entry(demarrer)
object MonProgramme {
demarrer() {
var vigueur := Potion(nom: "vigueur");
vigueur.boire();
vigueur.boire();
vigueur.boire();
vigueur.boire();
}
}
Du code à la naissance
constructor(nom: str) {
self.nom := nom;
self.doses := 3;
}
constructor est le seul membre d’un archetype qui porte un mot-clé. Il s’exécute au moment où
Potion(nom: "vigueur") fabrique l’exemplaire : ici, il pose le nom reçu et décide que
toute potion naît avec trois doses — un défaut qui n’est pas le zéro des champs omis.
Ses paramètres sont la nouvelle façade de la construction : l’appel donne ce que le constructeur demande, et le constructeur décide de ce que les champs deviennent.
Le constructeur remplace la construction par champs
Dès qu’un archetype a un constructeur, on ne construit plus qu’à travers lui. Tentez
Potion(nom: "vigueur", doses: 9) :
error[T022]: 'Potion' has no parameter 'doses'
Les champs ne sont plus des paramètres — seuls ceux du constructeur le sont. C’est le point du
mécanisme : si Potion garantit trois doses à la naissance, personne ne peut en fabriquer une
à neuf doses par la porte de côté.
L’état garde ses règles
boire() refuse de descendre sous zéro : le flacon vide le dit, et ne casse rien. Constructeur
et méthodes forment les deux bouts de la même discipline — l’un garantit comment un exemplaire
naît, les autres comment il évolue.
À vous
- Ajoutez un paramètre
doses: intau constructeur et passez-le àself.doses: l’appelPotion(nom: "vigueur", doses: 5)redevient légal — parce que le constructeur l’accepte. - Faites naître la potion avec
self.doses := 0;: le premierboire()tombe sur le flacon vide. - Donnez un défaut au paramètre —
constructor(nom: str, doses: int := 3)— et retrouvez la souplesse de la 5.4 :Potion(nom: "vigueur")etPotion(nom: "soin", doses: 5)marchent tous deux.