我正在学习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
如何在类
中调用受保护的方法的任何线索答案 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
关键字,如果您绝对需要调用它。