Programmation orientée objet en Tcl

Créé par François Bérard le 17 avril 2002

Cette page présente gml_Object.tcl, un script tcl permettant d'écrire des scripts "orientés objet" en tcl. Une page antérieure présente les principes de l'implémentation de gmlObject et donne une implémentation minimale.

Les principaux services "objet" implémentés sont:

Définition de classe

Une classe est créée à partir du moment où elle apparaît dans la définition d'une méthode:

  method NewClass NewMethod ...

Création d'instances

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

Définition de méthodes

Une méthode est définit en appelant la procédure "method" et en lui passant 4 paramètres:

  1. le nom de la classe
  2. le nom de la méthode
  3. la liste des paramètres de la méthode
  4. le corps de la méthode

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)
  }

Appel de méthodes

Une méthode est appelée sur un objet en appelant la procédure qui a le même nom que l'objet et en passant le nom de la méthode en premier paramètre de l'appel, suivi des paramètres de la méthode.
  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 ...
  }

Héritage

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 dispose
On 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.

Constructeur et destructeur

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).

Autre services...

Méthode inconnue

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.

Information sur les objets / classes

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>

Auto-chargement

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.