Можете ли вы, добрые люди, сказать, правильно ли это?
Мне кажется, все в порядке, за исключением того, что вам не нужен деструктор.Процедуры создаются в пространстве имен экземпляра объекта (в котором также находятся переменные объекта, FWIW), и оно автоматически удаляется при уничтожении объекта (и и наоборот ; вы не можете иметь его безother).
И если да, то где это может быть полезно?
Я использую процедуры (и другие команды), созданные внутри методов и конструкторов, довольно много.Они могут выполнять такие действия, как ведение частного суб-языка Tcl и т. Д. (Так же, как вы можете делать это, помещая команды в обычное пространство имен; это существенно не отличается), так что это действительно весьма полезно.Их также очень легко делегировать с помощью метода * 1013. * ed.
Один из самых простых приемов - создать подобъект внутри внешнего объекта и делегировать вызовы некоторых методов через:
oo::class create Outer {
constructor {} {
Inner create inner [self]
puts "created [self]"
}
destructor {
puts "destroyed [self]"
}
method foo {} {
puts "this is foo of [self]"
}
forward bar inner foo
}
oo::class create Inner {
constructor {outer} {
puts "created [self] inside $outer"
}
destructor {
puts "destroyed [self]"
}
method foo {} {
puts "this is foo of [self]"
}
}
Демонстрируя это:
Outer create x
# ⇒ created ::oo::Obj13::inner inside ::x
# ⇒ created ::x
x foo
# ⇒ this is foo of ::x
x bar
# ⇒ this is foo of ::oo::Obj13::inner
x destroy
# ⇒ destroyed ::x
# ⇒ destroyed ::oo::Obj13::inner
Показывает сдерживание и делегирование на работе (которое основано на том же механизме, который использовались бы вашими процедурами).Как видите, inner
создается внутри частного пространства имен x
, а x bar
маршрутизируется до inner foo
.Еще лучше, когда x
уничтожен, так же, как и inner
без специального кода вообще;это очень полезно в сложном коде.