parser

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

 

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

Только первый...

Sumo 11.07.2016 16:42

@main[]
  $o[^base2::create[]]
  $o.CLASS_NAME

  $o2[^base2::create2[]]
  $o2.CLASS_NAME

  $o3[^base2::create3[]]
  $o3.CLASS_NAME


@CLASS
base1

@create[]


@CLASS
base2

@BASE
base1

@create[]
  ^BASE:create[]

@create2[]
  $result[^BASE::create[]]

@create3[]
  $result[^BASE:create[]]
Резлуьтат:
base2
base1
string

Неожиданно, правда? :)

Если в конструкторе явно задать $result, то результатом работы конструктора будет именно то, что мы задали в result, а не объект класса.

Поэтому в create все происходит правильно. Мы вызываем конструктор базового класса (base1) для конструирования класса base2.

А вот в create2 мы зовем конструктор из base1 для создания объекта класса base1 и возвращаем объект класса base1.

В create3 вообще все хитро. Мы вызываем конструктор, но возвращаем строку, потому что результат работы констуктора base1 проигнорирован и create3 возвращает пустую строку.

Так что правильный только первый вариант. Явное задание result используем только если нам надо вернуть из конструктора объект другого типа. Это поведение нужно, когда мы хотим делать синглтоны или фабрики в классах.