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
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
Dynamic Semantics
5
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
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 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)));