Créé par François Bérard le 10 octobre 2001
L'objectif ici est de pouvoir définir des classes d'objet à partir desquelles on pourra créer des objets (aussi appelés "instances" de la classe) sur lesquelles ont peut appeler des méthodes.
La stratégie est la suivante : chaque objet a un nom (une chaîne de caractères). Pour chaque objet :
En s'inspirant de Tk ("button .b"), la syntaxe de création d'objets sera du type :
myClass myObject
où "myClass" est le nom de la classe dont on veut créer un objet de nom "myObject". Toujours en s'inspirant de Tk (".b flash"), l'appel de méthode se fait ainsi :
myObject theMethod
où "theMethod" est une méthode de la classe "myClass".
On crée une procédure par classe, qui a le nom de la classe, et qui crée des objets de la classe. Cette procédure a pour effet :
Par exemple, nous créons une classe "entier" qui nécessite une valeur initiale lors de la création d'objets.
proc entier { objName n } { upvar #0 $objName this set this(n) $n proc $objName { args } "uplevel entier_\[lindex \$args 0] $objName \[lrange \$args 1 end]" return $objName }
La création d'un objet de classe "entier" ayant pour valeur initiale "3" se fait par :
entier toto 3
La commande "upvar" (1ère ligne) permet de spécifier que, dans le corps de la procédure "entier", la variable "this" fait référence à la variable globale (grâce à l'option #0) dont le nom est contenu dans objName.
Pour appeler la méthode "incremente" sur l'objet "toto", on veut pouvoir faire :
toto incremente
C'est le rôle de la commande "proc" dans la procédure "entier" :
Pour définir une nouvelle méthode, on définit une procédure ayant pour préfixe le nom de la classe et un caractère souligné "_". Une méthode reçoit toujours en premier paramètre le nom de l'objet sur lequel elle est appelée.
proc entier_incremente { objName } { upvar #0 $objName this incr this(n) }
Ça y est, notre classe est entièrement définie, nous pouvons par exemple créer un objet "toto" de la classe entier avec pour valeur initiale 3, puis l'incrémenter et afficher la valeur du champ "n" de l'objet.
entier toto 3 toto incremente set toto(n) => 4
Autre exemple de méthode avec un nombre de paramètres variable, et son appel :
proc entier_add { objName args } { upvar #0 $objName this foreach val $args { incr this(n) $val } } toto add 10 100 set toto(n) => 114
On peut évidemment faire des choses beaucoup plus compliquées aboutissant à une grammaire plus élégante. On peut ajouter l'héritage... En pratique, il est rarement nécessaire de faire appel à de tels méchanismes quand on programme au niveau "script", c'est-à-dire au plus haut niveau d'abstraction.
Pour des implémentations plus complexes, il y a une page dédiée à l'orientation objet sur le site officiel de Tcl. L'implémentation la plus utilisée est sans doute iTcl.
(18/10/2001) [Chris]: La fonction de création d'objets renvoie le nom de l'objet créé.
(12/10/2001) Suppression de la procédure "DispatchMethod"