Перейти к основному содержимому
Версия: 6.x

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