Go to the first, previous, next, last section, table of contents.
-
Every object in the language has a type, which characterizes a set of
values and a set of applicable operations. The main classes of types are
elementary types (comprising enumeration, numeric, and access types) and
composite types (including array and record types).
-
An enumeration type defines an ordered set of distinct enumeration
literals, for example a list of states or an alphabet of characters. The
enumeration types Boolean, Character, and Wide_Character are predefined.
-
Numeric types provide a means of performing exact or approximate
numerical computations. Exact computations use integer types, which
denote sets of consecutive integers. Approximate computations use either
fixed point types, with absolute bounds on the error, or floating point
types, with relative bounds on the error. The numeric types Integer,
Float, and Duration are predefined.
-
Composite types allow definitions of structured objects with related
components. The composite types in the language include arrays and
records. An array is an object with indexed components of the same type.
A record is an object with named components of possibly different types.
Task and protected types are also forms of composite types. The array
types String and Wide_String are predefined.
-
Record, task, and protected types may have special components called
discriminants which parameterize the type. Variant record structures
that depend on the values of discriminants can be defined within a
record type.
-
Access types allow the construction of linked data structures. A value
of an access type represents a reference to an object declared as
aliased or to an object created by the evaluation of an allocator.
Several variables of an access type may designate the same object, and
components of one object may designate the same or other objects. Both
the elements in such linked data structures and their relation to other
elements can be altered during program execution. Access types also
permit references to subprograms to be stored, passed as parameters, and
ultimately dereferenced as part of an indirect call.
-
Private types permit restricted views of a type. A private type can be
defined in a package so that only the logically necessary properties are
made visible to the users of the type. The full structural details that
are externally irrelevant are then only available within the package and
any child units.
-
From any type a new type may be defined by derivation. A type, together
with its derivatives (both direct and indirect) form a derivation class.
Class-wide operations may be defined that accept as a parameter an
operand of any type in a derivation class. For record and private types,
the derivatives may be extensions of the parent type. Types that support
these object-oriented capabilities of class-wide operations and type
extension must be tagged, so that the specific type of an operand within
a derivation class can be identified at run time. When an operation of a
tagged type is applied to an operand whose specific type is not known
until run time, implicit dispatching is performed based on the tag of
the operand.
-
The concept of a type is further refined by the concept of a subtype,
whereby a user can constrain the set of allowed values of a type.
Subtypes can be used to define subranges of scalar types, arrays with a
limited set of index values, and records and private types with
particular discriminant values.
Go to the first, previous, next, last section, table of contents.