在itcl中调用受保护的方法

时间:2014-03-04 06:26:50

标签: tcl

我正在学习tcl。我正在创建一个类并编写一个受保护的方法。我试图使用对象调用受保护的方法,但我收到错误

以下是tcl

中的代码
::itcl::class p5 {
    protected variable pec "5"

    #constructor {} {
    #   set pec 10
    #}
    protected method abc {} {puts " value of pec is $pec";}
}

p5 o5
o5 abc

我收到以下错误

bad option "abc": should be one of...
  o5 cget -option
  o5 configure ?-option? ?value -option value...?
  o5 isa className

如何在类

中调用受保护的方法的任何线索

2 个答案:

答案 0 :(得分:2)

您不能在类的实例(或子类的实例)的上下文之外调用受保护的方法;这就是它受到保护的全部意义。但是你可以使用itcl::code进入上下文,这对于生成回调非常有用。当然,您必须在上下文中使用itcl::code

::itcl::class p5 {
    protected variable pec "5"
    protected method abc {} {puts " value of pec is $pec";}

    public method getAbcCaller {} {
        return [itcl::code $this abc]
    }
}

测试出来:

% p5 o5
o5
% o5 abc
bad option "abc": should be one of...
  o5 cget -option
  o5 configure ?-option? ?value -option value...?
  o5 getAbcCaller
  o5 isa className
% eval [o5 getAbcCaller]
 value of pec is 5

答案 1 :(得分:1)

如果您希望能够调用方法abc,请不要将其设为protected。从方法声明中删除关键字protected,您的程序应该可以正常工作。

更新

您可以在类中调用受保护的方法(即从同一类中的其他方法)。这就是受保护的含义。您可以使用Donal的方法通过保护,但这会违反protected关键字的目的。

顺便说一句,Donal的帖子激发了我提出另一种称为受保护方法的方法:

package require Itcl

::itcl::class p5 {
    protected variable pec "5"

    protected method abc {} {puts " value of pec is $pec";}
    protected method greet {name1 name2} { puts "Hello $name1 and $name2" }

    method callProtectedMethod {methodName args} {
        eval [$methodName {*}$args]
    }
}

p5 o5
o5 callProtectedMethod abc
o5 callProtectedMethod greet Harry Sally

我的方法创建了一个公共方法callProtectedMethod,它允许调用任何受保护的方法。同样,在这项工作中,我强烈建议您删除protected关键字,如果您绝对需要调用它。