Оператор ABSTRACT
Оператор ABSTRACT
- создание абстрактного действия.
Синтаксис
ABSTRACT [type [exclusionType]] [FIRST | LAST] [CHECKED] (argClassName1, ..., argClassNameN)
Описание
Оператор ABSTRACT
создает абстрактное действие, реализацию которого можно определять позже (например, в других модулях, зависящих от модуля, содержащего это ABSTRACT
действие). Реализации добавляются к действию с помощью инструкции ACTION+
. При выполнении абстрактного действия типа MULTI
и CASE
выбирается и выполняется его подходящая реализация. Выбор подходящей реализации зависит от выполнения условий выбора, которые задаются при добавлении реализаций, и от типа оператора ABSTRACT
.
CASE
- общий случай, условие выбора будет явно задаваться в реализации с помощью блокаWHEN
.MULTI
- полиморфная форма, условием выбора будет являться принадлежность параметров сигнатуре реализации. Этот тип является типом по умолчанию и может явно не задаваться.
Тип взаимоисключения оператора определяет могут ли несколько условий реализаций абстрактного действия одновременно выполняться при некотором наборе параметров. Тип EXCLUSIVE
указывает на то, что условия реализаций не могут одновременно выполняться. Тип OVERRIDE
допускает несколько одновременно выполняющихся условий, при этом то, какая из реализаций будет в итоге выбрана, определяется ключевыми словами FIRST
и LAST
.
При выполнении абстрактного действия типа LIST
последовательно выполняются все реализации. Порядок выполнения реализаций определяется ключевыми словами FIRST
и LAST
.
Оператор ABSTRACT
нельзя использовать внутри оператора {...}
.
Параметры
-
type
Тип абстрактного действия. Задается одним из ключевых слов:
CASE
MULTI
LIST
Значением по умолчанию является
MULTI
. -
exclusionType
Тип взаимоисключения. Одно из ключевых слов:
EXCLUSIVE
илиOVERRIDE
. Если не указано явно, то в абстрактном действии типаMULTI
типом взаимоисключения по умолчанию являетсяEXCLUSIVE
, в действии типаCASE
типом по умолчанию являетсяOVERRIDE
. Для абстрактного действия типаLIST
тип взаимоисключения не указывается. -
FIRST
|LAST
Ключевые слова. При указании слова
FIRST
реализации будут добавляться в начало списка реализаций, при указанииLAST
реализации будут добавляться в конец списка реализаций. Если не заданы, то по умолчанию используетсяFIRST
(кромеLIST
, где по умолчанию используетсяLAST
)Для абстрактных действий типа
CASE
иMULTI
c типом взаимоисключенияOVERRIDE
указаниеFIRST
будет означать, что из подходящих реализаций будет выполнена та, которая добавлена последней. Для действий типаLIST
указаниеFIRST
будет означать, что реализации будут выполняться в порядке обратном порядку их добавления. -
CHECKED
Ключевое слово. Если задано, то платформа автоматически проверит, что для всех потомков классов аргументов задана хотя бы одна реализация (или ровно одна, если условия взаимоисключающие).
-
argClassName1, ..., argClassNameN
Список имен классов аргументов свойства. Каждое имя задается идентификатором класса.
Примеры
// В данном случае создается ABSTRACT CASE OVERRIDE LAST
exportXls 'Выгрузить в Excel' ABSTRACT CASE (Order);
exportXls (Order o) + WHEN name(currency(o)) == 'USD' THEN {
MESSAGE 'Export USD not implemented';
}
CLASS Task;
run 'Выполнить' ABSTRACT (Task); // ABSTRACT MULTI EXCLUSIVE
CLASS Task1 : Task;
name = DATA STRING[100] (Task);
run (Task1 t) + {
MESSAGE 'Run Task1 ' + name(t);
}
CLASS OrderDetail;
price = DATA NUMERIC[14,2] (OrderDetail);
CLASS InvoiceDetail;
price = DATA NUMERIC[14,2] (InvoiceDetail);
fill ABSTRACT LIST (OrderDetail, InvoiceDetail); // ABSTRACT LIST LAST
fill (OrderDetail od, InvoiceDetail id) + {
price(id) <- price(od);
}