在itcl中调用受保护的方法

在itcl中调用受保护的方法,tcl,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 o

我正在学习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

任何关于如何在类中调用受保护的方法的线索

如果您希望能够调用方法
abc
,请不要将其设置为
受保护的
。从方法声明中删除关键字
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
关键字,我强烈建议您将其删除。

如果您希望能够调用方法
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
关键字,我强烈建议您将其删除。

如果您希望能够调用方法
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
关键字,我强烈建议您将其删除。

如果您希望能够调用方法
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
关键字,我强烈建议您删除它。

您不能从类实例(或子类实例)的上下文之外调用受保护的方法;这就是它被保护的全部意义。但是您可以使用
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

不能从类实例(或子类实例)的上下文之外调用受保护的方法;这就是它被保护的全部意义。但是您可以使用
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

不能从类实例(或子类实例)的上下文之外调用受保护的方法;这就是它被保护的全部意义。但是您可以使用
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

不能从类实例(或子类实例)的上下文之外调用受保护的方法;这就是它被保护的全部意义。但是您可以使用
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

是的,如果我删除受保护的,它会工作。但是我如何调用受保护的方法呢。有什么办法吗?是的,如果我移除受保护的,它会起作用。但是我如何调用受保护的方法呢。有什么办法吗?是的,如果我移除受保护的,它会起作用。但是我如何调用受保护的方法呢。有什么办法吗?是的,如果我移除受保护的,它会起作用。但是我如何调用受保护的方法呢。有办法吗?