3

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不是继承 at Derived,尽管Derived继承自Base

我做错了什么,还是incr Tcl被设计成这样?

4

2 回答 2

3

阅读文档我不认为 itcl 类中的 procs 以您认为应该的方式工作:

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

我对此的解读是,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
于 2011-01-21T15:56:54.427 回答
1

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

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
于 2011-01-21T17:51:03.970 回答