Инструкция ACTION+
Инструкция ACTION+ добавляет реализацию к абстрактному действию.
Синтаксис
[ACTION] abstractAction(param1, ..., paramN) +
[WHEN conditionExpr THEN]
{ actionBody }
[OPTIMISTICASYNC]
Описание
Инструкция ACTION+ не создает новое действие, а добавляет еще одну реализацию к уже объявленному абстрактному действию.
Для абстрактного действия типа CASE используется блок WHEN conditionExpr THEN. Для действий типов MULTI и LIST реализация записывается без блока WHEN ... THEN.
Параметры
-
ACTIONНеобязательное ключевое слово. Явно показывает, что расширяется действие.
-
abstractActionИдентификатор расширяемого абстрактного действия.
-
param1, ..., paramNСписок типизированных параметров добавляемой реализации. Он задает ее сигнатуру. Список может быть пустым. Количество параметров и их классы должны быть совместимы с сигнатурой абстрактного действия. Эти параметры можно использовать в
actionBodyи, для формыCASE, вconditionExpr. -
conditionExprВыражение для условия выбора этой реализации. Используется только для абстрактного действия типа
CASE. -
actionBodyТело добавляемой реализации: содержимое оператора
{...}, то есть последовательность операторов-действий и, при необходимости, объявленийLOCAL. Если абстрактное действие объявляет результат, возвращаемое значение и его параметры должны быть совместимы с этим результатом. -
OPTIMISTICASYNCКлючевое слово, помечающее добавляемую реализацию как оптимистично-асинхронную. Используется только в формах, где из нескольких реализаций выбирается одна.
Примеры
CLASS ABSTRACT Animal;
whoAmI ABSTRACT (Animal);
CLASS Dog : Animal;
whoAmI(Dog d) + {
MESSAGE 'I am a dog!';
}
CLASS Cat : Animal;
whoAmI(Cat c) + {
MESSAGE 'I am a cat!';
}
CLASS ABSTRACT Animal;
CLASS Dog : Animal;
notify(Animal a) ABSTRACT (Animal);
notify(Dog d) {
MESSAGE 'Dog';
}
notify[Animal](Dog d) + {
notify(d);
}
CLASS Human;
name = DATA STRING[100] (Human);
testName ABSTRACT CASE (Human);
testName(Human h) + WHEN name(h) == 'John' THEN {
MESSAGE 'I am John';
}
testName(Human h) + WHEN name(h) == 'Bob' THEN {
MESSAGE 'I am Bob';
}
onStarted ABSTRACT LIST ();
onStarted() + {
MESSAGE 'Подготовка данных';
}
onStarted() + {
MESSAGE 'Запуск обработчиков';
}
edit '{logics.edit}' ABSTRACT MULTI OVERRIDE FIRST (Object) TOOLBAR;
ACTION edit(Object o) + {
SHOW EDIT Object = o DOCKED;
} OPTIMISTICASYNC