ABSTRACT operator
The ABSTRACT
operator - creating an abstract action.
Syntax
ABSTRACT [type [exclusionType]] [FIRST | LAST] [CHECKED] (argClassName1, ..., argClassNameN)
Description
The ABSTRACT
operator creates an abstract action, the implementation of which can be defined later (for example, in other modules dependent on the module containing the ABSTRACT
action). Implementations are added to the action using the ACTION+
statement. When executing MULTI
or CASE
type abstract actions, their matching implementation is selected and executed. The selection of the matching implementation depends on the selection conditions that are defined when adding implementations, and on the ABSTRACT
operator type.
CASE
- a general case. The selection condition will be explicitly specified in the implementation using theWHEN
block.MULTI
- a polymorphic form. The selection condition is that the parameters match the implementation signature. This type is the default type and need not be explicitly specified.
The type of mutual exclusion of an operator determines whether several conditions for the implementation of an abstract action can simultaneously be met with a certain set of parameters. The EXCLUSIVE
type indicates that implementation conditions cannot be met simultaneously. The OVERRIDE
type allows several simultaneously fulfilled conditions, while which implementation is ultimately selected is determined by the keywords FIRST
and LAST
.
When performing a LIST
abstract action, all implementations are executed sequentially. The implementation order is determined by the keywords FIRST
and LAST
.
The ABSTRACT
operator cannot be used inside the {...}
operator.
Parameters
-
type
Type of abstract action. It is specified by one of these keywords:
CASE
MULTI
LIST
The default value is
MULTI
. -
exclusionType
Type of mutual exclusion. One of these keywords:
EXCLUSIVE
orOVERRIDE
. Unless explicitly specified, in aMULTI
abstract action the default type of mutual exclusion isEXCLUSIVE
, and in aCASE
action the default type isOVERRIDE
. For aLIST
abstract action the type of mutual exclusion is not specified. -
FIRST
|LAST
Keywords. When the word
FIRST
is specified, implementations will be added to the top of the implementations list; whenLAST
is specified, implementations will be added to the end of the implementations list. Unless specified, the default isFIRST
(exceptLIST
, where the default isLAST
)For abstract actions such as
CASE
andMULTI
with the type of mutual exclusionOVERRIDE
, specifyingFIRST
will mean that of the matching implementations, the last one added will be executed. For actions such asLIST
, specifyingFIRST
will mean that implementations will be executed in the reverse order of their addition. -
CHECKED
Keyword. If specified, the platform will automatically check that at least one implementation is defined for all descendants of the argument classes (or exactly one, if the conditions are mutually exclusive).
-
argClassName1, ..., argClassNameN
List of class names of property arguments. Each name is defined by a class ID.
Examples
exportXls 'Export to Excel' ABSTRACT CASE (Order); // ABSTRACT CASE OVERRIDE LAST is created
exportXls (Order o) + WHEN name(currency(o)) == 'USD' THEN {
MESSAGE 'Export USD not implemented';
}
CLASS Task;
run 'Execute' 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);
}