Lisaac/Cloner

Un livre de Wikilivres.
Sauter à la navigation Sauter à la recherche

Question : Et pour les constructeurs et l'instanciation ?[modifier | modifier le wikicode]

Les contructeurs sont des routines un peu particulières dans les langages à classes car elles permettent de créer et d'instancier des objets à partir du vide. Mais Lisaac a horreur du vide ! En effet chaque prototype (qu'il soit abstrait ou sous forme de template n'importe pas) est directement présent en mémoire sous la forme d'un objet "maître". Cet objet "maître" s'écrit en majuscule avec le nom du prototype.

Par exemple pour notre prototype de tout à l'heure l'objet maître est :

VECTOR_2

Il est "vivant" dans le sens ou vous pouvez lui envoyer des messages. En particulier vous pouvez lui demander de se cloner. Exemple:

Section Header
  + Name := MAIN_OBJECT;
  - Category := APPLICATION;

Section Private
  + point:VECTOR_2;

Section Public
  + main <-
  (
    point:=VECTOR_2.clone;
  );

Vous devez donc utiliser la méthode clone pour instancier un nouvel objet. Cette méthode est définie dans OBJECT, il ne faut donc pas oublier de faire hériter vos prototype de OBJECT si vous voulez pouvoir les cloner.

Q : Qu'y a t-il dans point avant l'opération de clonage ?[modifier | modifier le wikicode]

En fait ceci :

 + point:VECTOR_2

équivaut à :

 + point:VECTOR_2:=NULL

Au début point est donc une référence nulle.

Q : Oui mais comment je fais des constructeurs ?[modifier | modifier le wikicode]

C'est facile, si on refléchit bien un constructeur n'est rien d'autre qu'une fonction créant un nouvel objet suivant certains paramètres. On sait déjà fabriquer un nouvel objet : il faut utiliser clone. Pour l'initialisation du nouvel objet il suffit d'utiliser l'affectation normale. Bref si on arrête de faire de la mystification un constructeur c'est une méthode normale du prototype à créer. Exemple pour VECTOR_2 :

- make a,b:INTEGER :VECTOR_2 <- (
    + result:VECTOR_2;
    result:=VECTOR_2.clone;
    result.set_x a;
    result.set_y b;
    result
  );

Et pour l'utiliser :

+ v:VECTOR_2;
v:=VECTOR_2.make 22,48;