parser

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

 

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

Process в @auto[] — повторное выполнение статического конструктора

G_Z 14.09.2016 05:18

Задача: включить в класс набор свойств из файла (посредством process) и иметь возможность в классах наследниках перекрыть включённые свойства.
Включать напрямую в класс нельзя, это перекроет имеющиеся свойства, а нужно обратное.
Потому приходится использовать наследование.

Берём код:
@main[]
$class[^class::create[]]

$class.property1<br/>
$class.property2


@CLASS
base

@auto[]
^process[$self.CLASS]{@GET_property1[]
	included base property1
}
^process[$self.CLASS]{@GET_property2[]
	included base property2
}


@CLASS
class

@BASE
base

@create[]
Получаем ожидаемое:
included base property1
included base property2
Пытаемся переопределить одно из свойств:
@main[]
$class[^class::create[]]

$class.property1<br/>
$class.property2


@CLASS
base

@auto[]
^process[$self.CLASS]{@GET_property1[]
	included base property1
}
^process[$self.CLASS]{@GET_property2[]
	included base property2
}


@CLASS
class

@BASE
base

#@auto[]

@create[]

@GET_property1[]
defined class property1
Неожиданно получаем то же:
included base property1
included base property2
Стоит раскомментировать @auto дочернего класса — получаем ожидаемое:
defined class property1
included base property2
Выходит, выполняются оба @auto[], что противоречит документации.

Логируем вызовы:
@main[]
$class[^class::create[]]

$class.property1<br/>
$class.property2


@CLASS
base

@auto[]
^process[$self.CLASS]{@GET_property1[]
	included base property1
}
^process[$self.CLASS]{@GET_property2[]
	included base property2
}

$log[^reflection:uid[$self] base auto^#0A]
^log.save[append;/log.txt]


@CLASS
class

@BASE
base

@auto[]
$log[^reflection:uid[$self] class auto^#0A]
^log.save[append;/log.txt]

@create[]

@GET_property1[]
defined class property1
Видим в логе:
0x10e18f0b0 base auto
0x10e18f000 class auto
При этом, даже если закомментировать @auto[] дочернего класса и посмотреть в лог получим:
0x103dc20b0 base auto
0x103dc2000 base auto
Судя по всему, повторное выполнение происходит из-за process.
А указание @auto[] в наследнике позволяет перекрыть свойство базового класса.

Хотелось бы понять что происходит и как получить желаемое без указания @auto[] в классе-наследнике.