Невозможно скрыть конструктор в [incr Tcl]

Рассмотрим код ниже.

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 предназначен для такого поведения?


person Vahagn    schedule 21.01.2011    source источник
comment
Я понимаю всю религию фигурных скобок на собственной строке, но я никогда не понимал, почему люди настаивают на использовании их в языках, где они не поддерживаются без дополнительной синтаксической ерунды. ‹пожимание плечами›   -  person Bryan Oakley    schedule 21.01.2011


Ответы (1)


Я считаю, что это так работает, если вы посмотрите на спецификацию класса:

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, вы также можете получить некоторые подсказки относительно того, как добиться чего-то близкого к частный конструктор.

person Jackson    schedule 21.01.2011
comment
Я не нашел способа получить частный конструктор. Кажется, это просто языковой дефект. - person Vahagn; 21.01.2011
comment
@Vahagn Это просто способ, которым люди, написавшие Itcl, решили реализовать конструкторы, и, не зная, почему они сделали это таким образом, я бы не хотел говорить, что это дефект. Что вы хотите сделать, что вы действительно должны иметь частных конструкторов? - person Jackson; 23.01.2011