Next: , Previous: 3.9, Up: 3.9


3.9.1 Type Extensions

1/2
Every type extension is a tagged type, and is a record extension or a private extension of some other tagged type, or a non−interface synchronized tagged type..

Syntax

2

record_extension_part::= with record_definition
Legality Rules

3/2
The parent type of a record extension shall not be a class−wide type nor shall it be a synchronized tagged type (see 3.9.4). If the parent type or any progenitor is nonlimited, then each of the components of the record_extension_part shall be nonlimited. In addition to the places where Legality Rules normally apply (see 12.3), these rules apply also in the private part of an instance of a generic unit.

4/2
Within the body of a generic unit, or the body of any of its descendant library units, a tagged type shall not be declared as a descendant of a formal type declared within the formal part of the generic unit.

Static Semantics

4.1/2
A record extension is a null extension if its declaration has no known_discriminant_part and its record_extension_part includes no component_declarations.

Dynamic Semantics

5
The elaboration of a record_extension_part consists of the elaboration of the record_definition.

     NOTES

6

68  The term "type extension" refers to a type as a whole. The term "extension part" refers to the piece of text that defines the additional components (if any) the type extension has relative to its specified ancestor type.

7/2

69  When an extension is declared immediately within a body, primitive subprograms are inherited and are overridable, but new primitive subprograms cannot be added.

8

70  A name that denotes a component (including a discriminant) of the parent type is not allowed within the record_extension_part. Similarly, a name that denotes a component defined within the record_extension_part is not allowed within the record_extension_part. It is permissible to use a name that denotes a discriminant of the record extension, providing there is a new known_discriminant_part in the enclosing type declaration. (The full rule is given in 3.8.)

9

71  Each visible component of a record extension has to have a unique name, whether the component is (visibly) inherited from the parent type or declared in the record_extension_part (see 8.3).
Examples

10
Examples of record extensions (of types defined above in 3.9):

11

     type Painted_Point is new Point with
       record
         Paint Color := White;
       end record;
         −− Components and are inherited

12

     Origin constant Painted_Point := (X => 0.0, Paint => Black);

13

     type Literal is new Expression with
       record                 −− leaf in an Expression tree
         Value Real;
       end record;

14

     type Expr_Ptr is access all Expression'Class;
                                    −− see 3.10

15

     type Binary_Operation is new Expression with
       record                 −− an internal node in an Expression tree
         Left, Right Expr_Ptr;
       end record;

16

     type Addition is new Binary_Operation with null record;
     type Subtraction is new Binary_Operation with null record;
       −− No additional components needed for these extensions

17

     Tree Expr_Ptr :=         −− tree representation of "5.0 (13.0−−7.0)"
        new Addition'(
           Left  => new Literal'(Value => 5.0),
           Right => new Subtraction'(
              Left  => new Literal'(Value => 13.0),
              Right => new Literal'(Value => 7.0)));