Оператор 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Тип абстрактного действия. Задается одним из ключевых слов:
CASEMULTILIST
Значением по умолчанию является
MULTI. -
exclusionTypeТип взаимоисключения. Одно из ключевых слов:
EXCLUSIVEилиOVERRIDE. Если не указано явно, то в абстрактном действии типаMULTIтипом взаимоисключения по умолчанию являетсяEXCLUSIVE, в действии типаCASEтипом по умолчанию являетсяOVERRIDE. Для абстрактного действия типаLISTтип взаимоисключения не указывается. -
FIRST|LASTКлючевые слова. При указании слова
FIRSTреализации будут добавляться в начало списка реализаций, при указанииLASTреализации будут добавляться в конец списка реализаций. Если не заданы, то по умолчанию используетсяFIRST(кромеLIST, где по умолчанию используетсяLAST)Для абстрактных действий типа
CASEиMULTIc типом взаимоисключения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);
}