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的目的是什么?
答案 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