Инструкция +=
Инструкция += добавляет реализацию к абстрактному свойству.
Синтаксис
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 'Паспорт';