itcl::class

incr Tcl给Tcl提供一个面向对象(Object-Oriented)的扩展。

需要指出的是,incr Tcl的侧重点,并在于提供一个出色的面向对象的编程环境,而更多地在于提供一个在编程实践中把相关的代码和数据封装在一起的方法。

package require Itcl

itcl::class Person {
  common    nation  "China"    ;# 作用域 = class
  variable  name    "me"       ;# 作用域 = object, 类型 = scalar
  variable  attrs              ;# 作用域 = object, 类型 = scalar | array

  # 构造函数
  constructor {nickname args} {
     set name       $nickname
     set attrs(sex) "unknown"
  }

  # 析构函数
  destructor {
    # ...
  }

  # 成员函数
  method hello {args} {
    # 可以访问 common   变量
    # 可以访问 variable 变量
    puts "$nation / $name: Hello, [join $args]"
  }

  # 静态函数
  proc print {args} {
    # 可以访问 common   变量
    # 不能访问 variable 变量
    puts "Person: nation = $nation # [join $args]"
  }
}

# 创建对象
Person me "noyesno"

# 调用 proc
Person::print "Good Good Study, Day Day Up!"

# 调用 method
me hello "morning bird"

内置的属性管理

incr Tcl内置的属性管理提供类似于Tk组件中的cgetconfigure

$object cget -name                        ;# 查询属性
$object configure -name "noyesno"         ;# 设置属性

# 遍历属性
foreach item [$object configure] {
  lassign $item name initval value
}

类的继承

itcl::class GoodPerson {
  inherit Person             ;# 继承,可以指定多个父类

  method hello {args} {
    puts "I am good"
    chain {*}$args           ;# 在父类中查找并调用同名方法
  }
}

$object isa "Person"         ;# 类型测试 

类的自省

$object info class           ;# 所属类型
$object info inherit         ;# 返回`inherit`语句声明的父类
$object info heritage        ;# 返回所有继承链上的class

$object info function        ;# 查询 method 和 proc
$object info varaible        ;# 查询 variable 和 common

和C代码集成

# vim:set syntax=tcl: #
itcl::class Person {
  method secret {args} @secret
}

上面例子中的方法定义指向一个定义在C代码中的函数:

/* vim:set syntax=c: */
Itcl_RegisterC(interp, "secrete", SecretCmd);