【问题标题】:Can't hide constructor at [incr Tcl]无法在 [incr Tcl] 处隐藏构造函数
【发布时间】:2011-06-13 02:16:06
【问题描述】:

考虑下面的代码。

package require Itcl 

::itcl::class A \ 
{ 
private { 
    constructor { } { } { puts "==== at A::constructor" } 

    method f { } { puts "==== at A::f" } 
} 
} 

A a ;# PASSES

a f ;# fails

对于A 类,构造函数是私有的,但仍然可以定义A 的对象。

是我做错了什么,还是 incr Tcl 被设计成这样?

【问题讨论】:

  • 我了解整个大括号的宗教信仰,但我从来不明白为什么人们坚持在没有额外语法杂乱的情况下不支持它的语言中使用它。

标签: oop constructor tcl private incr-tcl


【解决方案1】:

我相信这是 itcl 的工作方式,如果你查看一个类的规范:

itcl::class className {
inherit baseClass ?baseClass...? 
constructor args ?init? body 
destructor body 
method name ?args? ?body? 
proc name ?args? ?body? 
variable varName ?init? ?config? 
common varName ?init? 
public command ?arg arg ...? 
protected command ?arg arg ...? 
private command ?arg arg ...? 
set varName ?value? 
array option ?arg arg ...? 
} 
className objName ?arg arg ...? 
objName method ?arg arg ...? 
className::proc ?arg arg ...? 

您可以看到 private/protected 可以应用于命令,但不能应用于构造函数或析构函数。在 itcl 设计模式的文档中查看 here 也可能会提供一些关于如何实现接近私有构造函数的东西的线索。

【讨论】:

  • 我没有找到获取私有构造函数的方法。看来这只是语言缺陷。
  • @ Vahagn 这正是编写 Itcl 的人决定实现构造函数的方式,而在不知道他们为什么这样做的情况下,我不愿意说这是一个缺陷。你想做什么,你真的必须有私人构造函数?
猜你喜欢
  • 2010-10-06
  • 2020-07-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多