Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oop [incr Tcl]中的静态函数继承_Oop_Inheritance_Tcl_Static Members_Incr Tcl - Fatal编程技术网

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相比,当他们做的事情不同,哪一个有缺陷?