Provided by: itcl3-doc_3.4.1-1ubuntu1_all bug

NAME

       class - create a class of objects

SYNOPSIS

       itcl::class className {
           inherit baseClass ?baseClass...?
           constructor args ?init? body
           destructor body
           method name ?args? ?body?
           proc name ?args? ?body?
           variable varName ?init? ?config?
           common varName ?init?

           public command ?arg arg ...?
           protected command ?arg arg ...?
           private command ?arg arg ...?

           set varName ?value?
           array option ?arg arg ...?
       }

       className objName ?arg arg ...?

       objName method ?arg arg ...?

       className::proc ?arg arg ...?

DESCRIPTION

       The  fundamental  construct  in  [incr Tcl] is the class definition.  Each class acts as a
       template for actual objects that can be created.  The class itself is  a  namespace  which
       contains  things  common  to  all  objects.  Each object has its own unique bundle of data
       which contains instances of the "variables" defined in the class definition.  Each  object
       also has a built-in variable named "this", which contains the name of the object.  Classes
       can also have "common" data members that are shared by all objects in a class.

       Two types of functions can be included in the class definition.  "Methods"  are  functions
       which  operate  on  a  specific  object, and therefore have access to both "variables" and
       "common" data members.  "Procs" are ordinary procedures in the class namespace,  and  only
       have access to "common" data members.

       If  the body of any method or proc starts with "@", it is treated as the symbolic name for
       a C procedure.  Otherwise, it is treated as a Tcl code script.  See below for  details  on
       registering and using C procedures.

       A  class  can  only be defined once, although the bodies of class methods and procs can be
       defined again and again for interactive debugging.  See the body and  configbody  commands
       for details.

       Each  namespace  can  have its own collection of objects and classes.  The list of classes
       available in the current context can be queried using the  "itcl::find  classes"  command,
       and the list of objects, with the "itcl::find objects" command.

       A  class  can  be  deleted  using  the  "delete class" command.  Individual objects can be
       deleted using the "delete object" command.

CLASS DEFINITIONS

       class className definition
              Provides the definition for a  class  named  className.   If  the  class  className
              already  exists,  or  if a command called className exists in the current namespace
              context, this command returns an error.  If the class  definition  is  successfully
              parsed,  className  becomes a command in the current context, handling the creation
              of objects for this class.

       The class definition is evaluated as a series  of  Tcl  statements  that  define  elements
       within the class.  The following class definition commands are recognized:

              inherit baseClass ?baseClass...?
                     Causes  the  current  class to inherit characteristics from one or more base
                     classes.  Classes must have been defined by a  previous  class  command,  or
                     must  be  available to the auto-loading facility (see "AUTO-LOADING" below).
                     A single class definition can contain no more than one inherit command.

                     The order of baseClass names in the inherit list affects the name resolution
                     for  class  members.   When the same member name appears in two or more base
                     classes, the base class  that  appears  first  in  the  inherit  list  takes
                     precedence.  For example, if classes "Foo" and "Bar" both contain the member
                     "x", and if another class has the "inherit" statement: inherit Foo Bar  then
                     the  name  "x"  means  "Foo::x".   Other inherited members named "x" must be
                     referenced with their explicit name, like "Bar::x".

              constructor args ?init? body
                     Declares the args argument list and body used for the constructor, which  is
                     automatically invoked whenever an object is created.

                     Before  the  body is executed, the optional init statement is used to invoke
                     any base class constructors that require arguments.  Variables in  the  args
                     specification  can be accessed in the init code fragment, and passed to base
                     class constructors.  After evaluating the init  statement,  any  base  class
                     constructors  that  have not been executed are invoked automatically without
                     arguments.  This ensures that all base classes are fully constructed  before
                     the   constructor   body  is  executed.   By  default,  this  scheme  causes
                     constructors to be invoked in order from least- to most-specific.   This  is
                     exactly  the  opposite  of  the  order that classes are reported by the info
                     heritage command.

                     If construction is successful, the constructor  always  returns  the  object
                     name-regardless  of  how  the  body is defined-and the object name becomes a
                     command in the current namespace context.  If construction fails,  an  error
                     message is returned.

              destructor body
                     Declares  the  body  used for the destructor, which is automatically invoked
                     when an object is deleted.  If the destructor is successful, the object data
                     is  destroyed  and  the  object  name  is  removed  as  a  command  from the
                     interpreter.  If destruction fails, an error message  is  returned  and  the
                     object remains.

                     When  an  object  is  destroyed,  all destructors in its class hierarchy are
                     invoked in order from most- to least-specific.  This is the order  that  the
                     classes  are  reported by the "info heritage" command, and it is exactly the
                     opposite of the default constructor order.

              method name ?args? ?body?
                     Declares a method called name.  When the method body is  executed,  it  will
                     have automatic access to object-specific variables and common data members.

                     If the args list is specified, it establishes the usage information for this
                     method.  The body command can be used to redefine the method body,  but  the
                     args list must match this specification.

                     Within  the  body  of another class method, a method can be invoked like any
                     other command-simply by using its name.  Outside of the class  context,  the
                     method  name must be prefaced an object name, which provides the context for
                     the data that it manipulates.  Methods in a base class that are redefined in
                     the  current  class, or hidden by another base class, can be qualified using
                     the "className::method" syntax.

              proc name ?args? ?body?
                     Declares a proc called name.  A proc is an  ordinary  procedure  within  the
                     class  namespace.  Unlike a method, a proc is invoked without referring to a
                     specific object.  When the proc body is executed,  it  will  have  automatic
                     access only to common data members.

                     If the args list is specified, it establishes the usage information for this
                     proc.  The body command can be used to redefine the proc body, but the  args
                     list must match this specification.

                     Within  the body of another class method or proc, a proc can be invoked like
                     any other command-simply by using its name.  In any other namespace context,
                     the proc is invoked using a qualified name like "className::proc".  Procs in
                     a base class that are redefined in the current class, or hidden  by  another
                     base class, can also be accessed via their qualified name.

              variable varName ?init? ?config?
                     Defines  an  object-specific  variable  named  varName.  All object-specific
                     variables are automatically available in class methods.  They  need  not  be
                     declared with anything like the global command.

                     If the optional init string is specified, it is used as the initial value of
                     the variable when a  new  object  is  created.   Initialization  forces  the
                     variable  to be a simple scalar value; uninitialized variables, on the other
                     hand, can be set within the constructor and used as arrays.

                     The optional config  script  is  only  allowed  for  public  variables.   If
                     specified,  this  code  fragment  is  executed whenever a public variable is
                     modified by the built-in "configure" method.  The config script can also  be
                     specified outside of the class definition using the configbody command.

              common varName ?init?
                     Declares  a  common  variable named varName.  Common variables reside in the
                     class namespace and are shared by all objects belonging to the class.   They
                     are  just  like global variables, except that they need not be declared with
                     the usual global command.  They  are  automatically  visible  in  all  class
                     methods and procs.

                     If the optional init string is specified, it is used as the initial value of
                     the variable.  Initialization forces the variable  to  be  a  simple  scalar
                     value;  uninitialized  variables,  on  the  other  hand,  can  be  set  with
                     subsequent set and array commands and used as arrays.

                     Once a common data member has been defined, it can  be  set  using  set  and
                     array commands within the class definition.  This allows common data members
                     to be initialized as arrays.  For example: itcl::class Foo {
                         common boolean
                         set boolean(true) 1
                         set boolean(false) 0 } Note that if common data members are  initialized
                     within  the  constructor,  they get initialized again and again whenever new
                     objects are created.

              public command ?arg arg ...?

              protected command ?arg arg ...?

              private command ?arg arg ...?
                     These commands are used to set the protection level for class  members  that
                     are created when command is evaluated.  The command is usually method, proc,
                     variable orcommon, and the remaining arg's complete the  member  definition.
                     However,  command  can  also  be  a  script containing many different member
                     definitions, and the protection level will apply to all of the members  that
                     are created.

CLASS USAGE

       Once  a  class  has  been  defined,  the class name can be used as a command to create new
       objects belonging to the class.

       className objName ?args...?
              Creates a new object in class className with the name objName.  Remaining arguments
              are  passed  to  the  constructor  of the most-specific class.  This in turn passes
              arguments to base class constructors before invoking its own body of commands.   If
              construction  is  successful,  a  command  called objName is created in the current
              namespace context, and objName is returned as the result of this operation.  If  an
              error is encountered during construction, the destructors are automatically invoked
              to free any resources that have been allocated, the object is deleted, and an error
              is returned.

              If   objName  contains  the  string  "#auto",  that  string  is  replaced  with  an
              automatically generated name.  Names have the  form  className<number>,  where  the
              className  part  is modified to start with a lowercase letter.  In class "Toaster",
              for example, the "#auto" specification would produce names like toaster0, toaster1,
              etc.    Note   that   "#auto"  can  be  also  be  buried  within  an  object  name:
              fileselectiondialog .foo.bar.#auto -background red This would  generate  an  object
              named ".foo.bar.fileselectiondialog0".

OBJECT USAGE

       Once  an  object  has  been  created,  the  object name can be used as a command to invoke
       methods that operate on the object.

       objName method ?args...?
              Invokes a method named method on an object named objName.  Remaining arguments  are
              passed  to the argument list for the method.  The method name can be "constructor",
              "destructor", any method name appearing in the class  definition,  or  any  of  the
              following built-in methods.

BUILT-IN METHODS

       objName cget option
              Provides  access  to  public  variables  as configuration options.  This mimics the
              behavior of the usual "cget" operation for Tk widgets.  The option  argument  is  a
              string  of  the  form  "-varName", and this method returns the current value of the
              public variable varName.

       objName configure ?option? ?value option value ...?
              Provides access to public variables as  configuration  options.   This  mimics  the
              behavior  of  the  usual  "configure" operation for Tk widgets.  With no arguments,
              this method returns a list of lists describing all of the public  variables.   Each
              list  has  three  elements:   the  variable name, its initial value and its current
              value.

              If a single option of the form "-varName" is specified, then  this  method  returns
              the information for that one variable.

              Otherwise,  the arguments are treated as option/value pairs assigning new values to
              public variables.  Each variable is assigned its new  value,  and  if  it  has  any
              "config"  code associated with it, it is executed in the context of the class where
              it was defined.  If the "config" code generates an error, the variable is set  back
              to its previous value, and the configure method returns an error.

       objName isa className
              Returns  non-zero if the given className can be found in the object's heritage, and
              zero otherwise.

       objName info option ?args...?
              Returns information related to a particular object named objName, or to  its  class
              definition.   The  option  parameter  includes the following things, as well as the
              options recognized by the usual Tcl "info" command:

              objName info class
                     Returns the name of the most-specific class for object objName.

              objName info inherit
                     Returns the list of base classes as  they  were  defined  in  the  "inherit"
                     command, or an empty string if this class has no base classes.

              objName info heritage
                     Returns  the  current  class name and the entire list of base classes in the
                     order that they are traversed for member lookup and object destruction.

              objName info function ?cmdName? ?-protection? ?-type? ?-name? ?-args? ?-body?
                     With no arguments, this command returns a list  of  all  class  methods  and
                     procs.   If  cmdName  is  specified,  it  returns information for a specific
                     method or proc.  If no flags are specified, this command returns a list with
                     the  following  elements:  the protection level, the type (method/proc), the
                     qualified name, the argument list and  the  body.   Flags  can  be  used  to
                     request specific elements from this list.

              objName  info  variable  ?varName?  ?-protection?  ?-type? ?-name? ?-init? ?-value?
              ?-config?
                     With no arguments, this  command  returns  a  list  of  all  object-specific
                     variables  and  common  data  members.   If varName is specified, it returns
                     information for a specific data member.  If no  flags  are  specified,  this
                     command  returns  a list with the following elements:  the protection level,
                     the type (variable/common), the qualified name, the initial value,  and  the
                     current  value.   If  varName  is  a  public  variable, the "config" code is
                     included on this list.  Flags can be used to request specific elements  from
                     this list.

CHAINING METHODS/PROCS

       Sometimes  a  base  class  has  a method or proc that is redefined with the same name in a
       derived class.  This is a way of making the derived class handle the  same  operations  as
       the  base  class,  but  with its own specialized behavior.  For example, suppose we have a
       Toaster class that looks like this: itcl::class Toaster {
           variable crumbs 0
           method toast {nslices} {
               if {$crumbs > 50} {
                   error "== FIRE! FIRE! =="
               }
               set crumbs [expr $crumbs+4*$nslices]
           }
           method clean {} {
               set crumbs 0
           } } We might create another class like SmartToaster that redefines the "toast" method.
       If we want to access the base class method, we can qualify it with the base class name, to
       avoid ambiguity: itcl::class SmartToaster {
           inherit Toaster
           method toast {nslices} {
               if {$crumbs > 40} {
                   clean
               }
               return [Toaster::toast $nslices]
           } } Instead of hard-coding the base class name, we can use the  "chain"  command  like
       this: itcl::class SmartToaster {
           inherit Toaster
           method toast {nslices} {
               if {$crumbs > 40} {
                   clean
               }
               return [chain $nslices]
           } } The chain command searches through the class hierarchy for a slightly more generic
       (base class) implementation of a method  or  proc,  and  invokes  it  with  the  specified
       arguments.   It  starts  at the current class context and searches through base classes in
       the  order  that  they  are  reported  by  the  "info  heritage"  command.    If   another
       implementation is not found, this command does nothing and returns the null string.

AUTO-LOADING

       Class definitions need not be loaded explicitly; they can be loaded as needed by the usual
       Tcl auto-loading facility.  Each directory containing class definition files  should  have
       an  accompanying  "tclIndex"  file.   Each line in this file identifies a Tcl procedure or
       [incr Tcl] class definition and the file where the definition can be found.

       For example, suppose a directory  contains  the  definitions  for  classes  "Toaster"  and
       "SmartToaster".   Then  the  "tclIndex"  file  for  this  directory would look like: # Tcl
       autoload index file, version  2.0  for  [incr  Tcl]  #  This  file  is  generated  by  the
       "auto_mkindex"  command  #  and  sourced  to set up indexing information for one or # more
       commands.  Typically each line is a command that #  sets  an  element  in  the  auto_index
       array,  where the # element name is the name of a command and the value is # a script that
       loads the command.

       set  auto_index(::Toaster)  "source  $dir/Toaster.itcl"   set   auto_index(::SmartToaster)
       "source $dir/SmartToaster.itcl"

       The  auto_mkindex  command  is used to automatically generate "tclIndex" files.  The auto-
       loader must be made aware of this  directory  by  appending  the  directory  name  to  the
       "auto_path"  variable.   When this is in place, classes will be auto-loaded as needed when
       used in an application.

C PROCEDURES

       C procedures can be integrated into an [incr Tcl] class definition to  implement  methods,
       procs,  and  the  "config"  code  for  public variables.  Any body that starts with "@" is
       treated as the symbolic name for a C procedure.

       Symbolic names are established by registering procedures via  Itcl_RegisterC().   This  is
       usually  done  in  the  Tcl_AppInit()  procedure,  which  is automatically called when the
       interpreter starts up.  In the following example, the procedure My_FooCmd() is  registered
       with  the  symbolic  name  "foo".  This procedure can be referenced in the body command as
       "@foo".  int Tcl_AppInit(interp)
           Tcl_Interp *interp;     /* Interpreter for application. */ {
           if (Itcl_Init(interp) == TCL_ERROR) {
               return TCL_ERROR;
           }

           if (Itcl_RegisterC(interp, "foo", My_FooCmd) != TCL_OK) {
               return TCL_ERROR;
           } } C procedures are implemented just like ordinary Tcl commands.  See the  CrtCommand
       man  page  for  details.   Within  the  procedure, class data members can be accessed like
       ordinary variables using Tcl_SetVar(), Tcl_GetVar(), Tcl_TraceVar(), etc.   Class  methods
       and  procs can be executed like ordinary commands using Tcl_Eval().  [incr Tcl] makes this
       possible by automatically setting up the context before executing the C procedure.

       This scheme provides a natural migration  path  for  code  development.   Classes  can  be
       developed  quickly  using  Tcl code to implement the bodies.  An entire application can be
       built and tested.  When necessary, individual bodies can be implemented  with  C  code  to
       improve performance.

KEYWORDS

       class, object, object-oriented