Créé par François Bérard le 17 avril 2002
Les principaux services "objet" implémentés sont:
Une classe est créée à partir du moment où elle apparaît dans la définition d'une méthode:
method NewClass NewMethod ...
Un objet (une instance) est créé en appelant la procédure qui a le nom de la classe et en donnant le nom de l'objet comme premier paramètre de l'appel.
NewClass newObject
Une méthode est définit en appelant la procédure "method" et en lui passant 4 paramètres:
Dans le corps de la méthode, le tableau associatif "this" permet d'accéder aux attributs de l'objet sur lequel la méthode a été appelée. Le tableau associatif "class" permet d'accéder aux attributs de la classe (champs "static" en C++). Trois variable sont implicitement définies: "objName" (le nom de l'objet), "className" (le nom de la classe) et "methodName" (le nom de la méthode). Il est recommandé de ne pas modifier la valeur de ces 3 variable sous peine de rendre incohérent le mécanisme d'héritage.
method NewClass NewMethod { a b } { puts "Calling method $methodName of class $className on object $objName" set this(a) $a set this(b) $b incr class(objCount) }
newObject NewMethod 1 2
Dans le corps d'une méthode, le procédure "this" est utilisée pour appeler des méthodes sur l'objet "courant".
method ... { this anotherMethod ... }
Une classe hérite des méthodes d'une classe mère en appelant la procédure "inherit":
inherit HeritingClass SuperClass
Si la classe "HeritingClass" n'existe pas dans l'interpréteur au moment de l'appel à "inherit", alors elle est créée. Si "SuperClass" n'existe pas au moment de l'appel, alors une tentative de charger sa définition est faite grâce à la commande "auto_load" de Tcl.
Par défaut, toute classe hérite de la classe "gmlObjRootClass" qui a la méthode "dispose" pour détruire des objets. Ainsi, "dispose" doit être appelé sur tout objet dont on n'a plus besoin.
newObject disposeOn peut spécifier l'appel d'une méthode héritée d'une classe particulière en préfixant le nom de la méthode par le nom de la classe suivi de "::":
this SuperClass::NewMethod
Dans le corps d'une méthode spécialisée, on peut appeler la méthode héritée en utilisant le nom de méthode "inherited":
this inherited x y z
où x, y et z sont trois paramètres passés à la méthode héritée.
Si une classe a une méthode appelée "constructor", alors cette méthode est appelée après la création d'instances de la classe. Un constructeur ne peut pas renvoyer de résultat (le résultat est ignoré).
method IntClass constructor { initialValue } { set this(i) $initialValue }
Si une class a une méthode appelée "destructor", alors cette méthode est appelée avant la destruction d'instances de la classe. Un constructeur ne peut pas recevoir de paramètre et ne renvoie pas de valeur (car elle sera ignorée).
Si une méthode de nom inconnu est appelée sur un objet, alors l'appel est remplacé par un appel à la méthode "unknown" en insérant le nom de la méthode inconnue comme premier paramètre de l'appel. Par exemple, si l'objet "newObject" n'a pas de méthode "someMethod", l'appel:
newObject someMethod a b c
est remplacé par
newObject unknown someMethod a b c
Par défaut, tout objet a une méthode "unknown" dont il hérite de la classe "gmlRootClass". Cette méthode se contente d'interrompre le script en générant un message d'erreur.
La commande "gmlObject info" permet de connaître les classes, méthodes, objets qui existent à un instant donné. Par exemple, l'implémentation d'une classe peut être connue à tout moment par la commande:
gmlObject info class <NomDeLaClasse>
Pour utiliser le mécanisme d'auto-chargement des définitions de classes (voir la page de référence Tcl de "auto_load"), vous pouvez exécuter le script "gml_MakeIndex.tcl" dans les répertoires contenants vos sources pour créer les fichiers "tclIndex".
Merci d'envoyer tout commentaire, rapport de bug, etc à François Bérard.