parser

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

 

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

объект - экземпляр класса vs объект имеет прототипом класс

moko 09.09.2016 18:12

Поступило предложение сделать объекты в парсере не как сейчас, экземплярами класса, а чтобы они имели прототипом класс, по аналогии с Java Script. При чтении отличий нет, а вот запись будет всегда происходить в поле объекта. Сейчас, если такое поле есть в классе, при записи в поле объекта изменится его значение в классе. Обратная совместимость здесь понятно не 100%, но по факту изменение свойств класса из объекта - редкий и не самый логичный случай (во всяком случае у нас на первый взгляд несовместимостей не вылезло). Зато можно будет так:
@main[]

# обычный объект
$o[^test::create[]]
$o.default
^o.method[]

# можно сделать объект, у которого значения свойства отличается от значения в классе
$o[^test::create[some]]
$o.default

# можно сделать объект, у которого метод отличается от обычной реализации
$o[^test::create[special]]
^o.method[]

# как и раньше, статическое поле класса можно переопределить
$test:default
$test:default[all but one]

# и оно изменится у использующих его объектов
$o.default

@CLASS
test

@auto[]
$default[all]

@create[d]
^if($d eq 'special'){
    $method[$special]
}(def $d){
    $default[$d]
}

@method[]
common

@special[]
special
Какие будут мнения? :)

P.S. Чтобы протестировать такое поведение, достаточно в pa_vclass.C закомментировать строки 157 и 158.