Contents Index Search Related Documents Previous Next
3.9.1 Type Extensions
1
Every
type extension is a tagged type, and is either a
record extension
or a
private extension of some other 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.
6
69 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
70 When an extension is
declared immediately within a body, primitive subprograms are inherited
and are overridable, but new primitive subprograms cannot be added.
8
71 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
72 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 X and Y are inherited
12
Origin : constant Painted_Point := (X | Y => 0.0, Paint => Black);
13
type Literal is new Expression with
record -- a 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 := -- A 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)));
Contents Index Search Related Documents Previous Next Legal