我在学习tcl。我正在创建一个类并编写一个受保护的方法。我试图使用object调用受保护的方法,但是我得到了错误。
下面是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在类中如何调用受保护的方法
发布于 2014-03-04 10:33:28
您不能从类的实例(或子类的实例)的上下文之外调用受保护的方法;这就是被保护的全部意义所在。但是您可以使用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发布于 2014-03-04 06:37:20
如果您希望能够调用方法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关键字,我强烈建议删除它。
https://stackoverflow.com/questions/22164534
复制相似问题