deferred | subprogram declaration |
Syntax | A deferredDeclaration is:
| |||||||||
Description | A procedure or function is declared to be deferred when you want to be able to override the subprogram in an expansion. The procedure or function must be in a module, monitor or class.
| |||||||||
Example | The display procedure is deferred in this class of stacks to allow various ways of graphically displaying the stack on the screen:
class stack export push, pop … local declarations … … declarations of the push and pop procedures … deferred procedure display (howbig : int) end stackAn expansion to the stack class can give a body for display, as in:
class stackWithSimpleDisplay body procedure display % (howbig : int) … graphically display the stack on the screen … end display end stackWithSimpleDisplayThe following creates a stack that can be displayed and displays it:
var p : ^stackWithSimpleDisplay new p … p -> display (25) % Display the stack on the screen | |||||||||
Details | A deferred procedure is resolved by giving its body. This can be done in the scope (module, monitor or class) containing the deferred declaration (following the deferred declaration) or in any expansion of that scope. Only one resolution per scope is allowed. Unresolved subprograms can be called, but they immediately abort. All exported subprograms are implicitly deferred and can be overridden in expansions. During initialization of a module, monitor or object of a class, deferred subprograms (including exported subprograms) cannot be called. This restriction prevents accessing an object before it is fully initialized. A deferred declaration must not appear in the main program.
| |||||||||
See also | module, monitor and class. See also export list, import list, inherit list, implement list and implement by list.
|