Новости | FAQ | Авторы | Документация | В действии | Библиотека |
Инструменты | Полезные ссылки | Хостинги | Скачать | Примеры | Форум |
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 идет из базового конструктора