| Новости | 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 идет из базового конструктора