Section 7.4

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: int au constructeur et passez-le à self.doses : l’appel Potion(nom: "vigueur", doses: 5) redevient légal — parce que le constructeur l’accepte.
  • Faites naître la potion avec self.doses := 0; : le premier boire() 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") et Potion(nom: "soin", doses: 5) marchent tous deux.