parser

Написать ответ на текущее сообщение

 

 
   команды управления поиском

Отбой вопроса. Спросил, в состоянии утомления. Отвечу сам себе...

andylars 11.07.2016 16:45 / 11.07.2016 17:15

Ответ= все три (на самом деле 3.5) способа имеют право на применение, но в разных случаях.
@CLASS
BaseClass

@create[_param]
   $self.param[$_param+base]

#----------------------------------

@CLASS
MyClass

@BASE
BaseClass

@create[_param]
   $self.param[$_param]

# 1. Если мы хотим просто дополнить процедуру
#    базового конструктора, то вызываем его статически 
#    и потом доделываем что-то в частности

   ^BASE:create[$self.param]
   $self.param[$self.param+child]


# 2. Мы можем хотеть отдельный объект базового класса внутри контекста
#    дочернего для каких-то "адаптеров", тогда мы делаем так:

   $self.baseobj[^BASE::create[$self.param]]

# 3. Если нам нужна просто прозрачная трансляция базового конструктора 
#    без манипуляций - то мы просто НЕ объявляем конструктор - в дочернем.

# 3.1. @create[] <- не объявляется в дочернем классе


# 3.2. А можем поделать что-то процедурное, но не трогая контекст самого объекта ($self)
#    и гарантируя, что он будет таким, какой его создает базовый конструктор
#    тогда мы можем сделать так:

   ^if($_param eq 'test2'){
      ^MAIN:somedo[manipulation]
      $result[^BASE::create[$_param]]
   }

#   а вот так, мы вообще не можем делать, всё сломается (да оно и не надо)
   $self[^BASE::create[$_param]]


@main[]

   $obj[^MyClass::create[test]]
   $obj.param           = 1. test+base+child
   $obj.baseobj.param   = 2. test+base 

   $obj[^MyClass::create[test2]]
   $obj.param           = 3. test2+base
   $obj.baseobj.param   = не существует, т.к. $self идет из базового конструктора