当我运行我的(专有)代码时,我得到了这个:
info object isa class DlgClass is:1 DlgClass does not refer to an object while executing "::oo::Obj6::my Set DlgClass" ("uplevel" body line 1) invoked from within "uplevel 1 [list [namespace which my] Set $args]" (class "::oo::Slot" method "-set" line 2) invoked from within "::oo::Obj6::my --default-operation DlgClass" ("uplevel" body line 1) invoked from within "uplevel 1 [list [namespace which my] $def {*}$args]" (class "::oo::Slot" method "unknown" line 6) invoked from within "superclass DlgClass" (in definition script
两行代码(1代表生成消息,前面代码代码)是:
puts "info object isa class DlgClass is:[info object isa class DlgClass]"
superclass DlgClass
我不明白。第一行输出(info object isa class DlgClass is:1
)是否表明超类确实定义了?
答案 0 :(得分:1)
TclOO定义非常强烈地关注当前堆栈帧是什么,因为oo::define
命令在内部调用帧结构中使用私有变量来存储正在定义的类的标识。出于某种原因(我发现有点令人惊讶)source
命令干扰了这一点。
可能最有效的解决方法是编写自己的解决方法。幸运的是,您可以将它放在正确的命名空间中,并让它在您真正需要它的地方工作:
# Very simple version of the standard [source] command
proc ::oo::define::source {filename} {
set f [open $filename]
set script [read $f]
close $f
tailcall eval $script
}
另一方面,即使没有source
的特殊版本,当我尝试时,你的脚本也适用于我。还有其他事情正在发生。
答案 1 :(得分:0)
显然,当我从类块中对超类的定义进行惰性求值时会发生这种情况。 即 而不是写作:
oo::class create foo {
source "DlgClass.tcl" ;# if needed
superclass DlgClass
}
需要做的事情:
source "DlgClass.tcl" ;# if needed
oo::class create foo {
superclass DlgClass
}
然后它有效。我认为它可能是oo :: class / tcl引擎中的一个错误,但是,因为它很容易解决,而不是主要的。