Oop [incr Tcl]中的静态函数继承
中的继承未按预期工作。考虑下面的代码。Oop [incr Tcl]中的静态函数继承,oop,inheritance,tcl,static-members,incr-tcl,Oop,Inheritance,Tcl,Static Members,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不会在Derive
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
我是做错了什么,还是故意这样做?阅读文档时,我认为itcl类中的进程不会按照您认为应该的方式工作: 过程名称?参数?身体? 声明一个名为name的进程。proc是内部的一个普通过程 类名称空间。与方法不同, 调用proc时不引用 特定的物体。当程序体 执行时,它将具有自动 仅访问公共数据成员。 如果指定了args列表,它将为 这个过程。body命令可以是 用于重新定义过程主体,但 args列表必须与此匹配 规范。 在另一个类方法或proc的主体内,可以调用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
您定义的进程
Base::function
或多或少是命名空间Base
中的常规进程。当您在Itcl中继承时,您只继承方法,而不继承过程。在相关说明中,您不能从Base
的实例调用proc函数
,您必须像调用任何常规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
目标是使
[incr Tcl]
类的行为类似于C++
类。这似乎是一个语言缺陷。@瓦哈根似乎假定C++是实现类的一种真正方式。其他OO语言做的事情不同,例如,C++和SimalTalk相比,当他们做的事情不同,哪一个有缺陷?