Инструкция +=
Инструкция += добавляет реализацию к абстрактному свойству.
Синтаксис
abstractProperty(param1, ..., paramN) +=
[WHEN conditionExpr THEN]
implementationExpr;
Описание
Инструкция += не создает новое свойство. Она добавляет еще одну реализацию к уже объявленному абстрактному свойству.
Для абстрактного свойства типа CASE блок WHEN conditionExpr THEN обязателен. Для абстрактных свойств типов MULTI и VALUE блок WHEN ... THEN не используется, и выражение реализации записывается сразу после +=.
Инструкция += относится только к свойствам. Реализация абстрактного действия добавляется инструкцией ACTION+: после знака + записывается тело действия, а не выражение.
Позиция добавляемой реализации в списке реализаций абстрактного свойства определяется его настройкой OVERRIDE FIRST / OVERRIDE LAST; доступные режимы — в статье об операторе ABSTRACT.
Для абстрактного свойства во взаимоисключающем режиме (по умолчанию для MULTI) платформа при финализации модулей на старте сервера проверяет, что условия реализаций не пересекаются; для формы MULTI это сигнатуры реализаций, и пересечение останавливает запуск с ошибкой signature intersection of property ... for abstract property .... В частности, абстрактное свойство без параметров в этом режиме допускает не более одной реализации: второй +=, даже из другого модуля, — такое пересечение. Свойство, которое должно принимать несколько одновременно подходящих реализаций либо реализацию по умолчанию и переопределяющую её, объявляется в режиме OVERRIDE, который записывается после формы: у ABSTRACT VALUE он действует по умолчанию — применяется добавленная позже реализация, когда она возвращает значение, иначе более ранняя; ABSTRACT MULTI OVERRIDE применяет более конкретную сигнатуру, а при равных сигнатурах — добавленную позже.
Параметры
-
abstractPropertyИдентификатор расширяемого абстрактного свойства.
-
param1, ..., paramNСписок типизированных параметров добавляемой реализации; задает ее сигнатуру. Список может быть пустым. Количество параметров и их классы должны быть совместимы с сигнатурой абстрактного свойства. Эти параметры можно использовать в
implementationExprи, для формыCASE, вconditionExpr. -
conditionExprВыражение для условия выбора этой реализации. Используется только для абстрактного свойства типа
CASE. -
implementationExprВыражение для реализации. Его класс результата должен быть совместим с классом результата абстрактного свойства.
Примеры
CLASS ABSTRACT AClass;
CLASS BClass : AClass;
CLASS CClass : AClass;
CLASS DClass : AClass;
name(AClass a) = ABSTRACT BPSTRING[50] (AClass);
innerName(BClass b) = DATA BPSTRING[50] (BClass);
innerName(CClass c) = DATA BPSTRING[50] (CClass);
innerName(DClass d) = DATA BPSTRING[50] (DClass);
name(BClass b) = 'B' + innerName(b);
name(CClass c) = 'C' + innerName(c);
name[AClass](BClass b) += name(b);
name(CClass c) += name(c);
name(DClass d) += 'DClass' + innerName(d) IF d IS DClass;
CLASS Person;
CLASS PersonDocumentType;
name = DATA ISTRING[64] (PersonDocumentType);
caption = ABSTRACT CASE ISTRING[100] (Person, PersonDocumentType);
caption(Person p, PersonDocumentType t) +=
WHEN p IS Person AND name(t) == 'Passport' THEN 'Паспорт';