[incr Tcl]中的静态函数继承

时间:2011-01-21 08:27:45

标签: oop inheritance tcl static-members incr-tcl

incr Tcl中的继承无法按预期工作。请考虑以下代码。

package require Itcl

::itcl::class Base \
{
public {
    proc function { } { puts "==== Base::function" }
}
}

::itcl::class Derived { inherit Base }

Base::function
Derived::function    ;# FAILS

最后一行失败,因此Base::function未继承Derived,但Derived继承Base

我做错了什么,或者incr Tcl的目的是什么?

2 个答案:

答案 0 :(得分:3)

阅读文档我不认为itcl类中的proc会按照你认为应该的方式工作:

  

proc name?args? ?身体?       声明一个名为proc的proc。 proc是一个普通的程序   类命名空间。与方法不同,   调用proc而不参考   一个特定的对象。当proc体   执行后,它将自动执行   仅访问公共数据成员。       如果指定了args列表,则会为其建立使用信息   这个过程。 body命令可以   用于重新定义proc体,但是   args列表必须与此匹配   规格。       在另一个类方法或proc的主体内,可以调用proc   像任何其他命令一样 - 只需使用   其名称。在任何其他命名空间   上下文,使用a调用proc   限定名称,如“className :: proc”。   在基类中进行处理   在当前类中重新定义,或   被另一个基类隐藏,也可以   可以通过他们的合格名称访问。

我对此的解读是proc与它的类相关联,它可以在派生类中引用,但它没有在其中定义。例如,以下工作:

package require Itcl

::itcl::class Base {
    public {
        proc function { } { puts "==== Base::function" }
    }
}

::itcl::class Derived { 
inherit Base 
    public {

        proc function { } { 
            puts "==== Derived::function"
            return [Base::function] 
        }
    }
}

Base::function
Derived::function    ;# FAILS

答案 1 :(得分:1)

您定义的Base::function的proc是(或多或少)命名空间Base中的常规proc。当你在Itcl中继承时,你只是继承方法,你不继承procs。在相关说明中,您无法从function的实例调用proc Base,您必须像任何常规过程一样调用它。

itcl::class Base {
  public {
    proc function { } { puts "==== Base::function" }
  }
  public method test {} {
    $this function
  }
  public method test2 {} {
    function
  }
}

Base bb
bb test   ;# yields error: bad option "function"
bb test2  ;# works as expected