Оператор 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);
}