La declaración de un tipo requiere la especificación
de un
nombre y la definición (descripción) del mismo; la forma
general
de una declaración de tipo es: type Nombre_Tipo is
Definición_tipo;. La forma de la definición
depende
de la clase de tipo que se esté definiendo. Un tipo se dice que
es
derivado si en su definición se utiliza la palabra new
en
referencia a otro tipo (como los tipos Entero y Entero_Corto del
siguiente ejemplo); un tipo derivado obtiene las características
del que deriva (su "tipo padre").
type Octeto is range 0..255;
type Entero is new Integer;
type Entero_Corto is new Entero range 0..1000;
type Vector is array(1..20) of Float;
A veces (Ej. cuando se crean
estructuras de datos dinámicas) es conveniente hacer una
declaración incompleta de tipo que permita disponer de un nombre
de tipo que en realidad se definirá con posterioridad en la
misma región del programa.
type Un_Tipo; --sólo se declara un
nombre
--la definición
del tipo requiere
--una nueva
declaración
Una declaración de tipo define los valores del
tipo y un conjunto de operaciones predefinidas en función de su
clase; el usuario puede adjuntar su propia definición de operaciones primitivas adicionales para el
tipo que está definiendo (simplemente tiene
que adjuntar subprogramas que tengan
entre sus parámetros objetos del tipo).
Un subtipo define un subconjunto restringido de valores de un tipo base con atributos específicos. Se declara utilizando la palabra subtype en vez de type; en la definición hay que indicar cuál es el tipo base del subtipo.
subtype Byte is Integer range 0..255;
Ada es un lenguaje fuertemente tipado: en general no se pueden
mezclar valores de tipos diferentes aún cuando pudieran parecer
equivalentes (ni siquiera de un tipo derivado y su tipo padre). Esta
regla no incluye a los subtipos: los valores de un subtipo son
valores del tipo base.
Se pueden realizar conversiones explícitas entre tipos estrechamente relacionados tal como se establece en la sección 4.6 del "Ada 95 Reference Manual"; para ello se utiliza el tipo destino como si fuera el nombre de una función con un parámetro que es una expresión del tipo origen de la conversión.
X: Float;
Y: Integer := 5;
...
X := Float(Y); --se asigna a X el valor real 5.0
Una conversión de tipo cuyo parámetro es
una variable no cambia el tipo de la variable, lo que hace es
devolver el valor que en el tipo destino corresponde al valor del tipo
origen asociado a la variable según las reglas de
conversión.
Los tipos escalares ofrecen atributos (image, value)
para obtener la representación de un valor como ristra de caracteres (string) y
viceversa.
Otros tipos (Ej. ristras de
tamaño limitado y ristras
de tamaño dinámico) ofrecen, entre sus operaciones primitivas, funciones de
conversión a tipos relacionados.
type T1 is limited record
...
end record;
type T2 is limited private;
type T_Privado is private;
En el ámbito de su declaración un tipo privado
sólo admite asignación
y operadores relacionales de
igualdad (a menos que además sea limitado).
Una declaración de tipo privado se puede hacer en la
sección pública de la especificación de un paquete; tal tipo debe
redeclararse en la sección privada (private) de dicha
especificación, donde se definirán sus
características "ocultas" que sólo podrán usarse
dentro del paquete.
También puede declararse privado un parámetro formal genérico en cuyo caso dentro de la unidad genérica sólo se le podrán aplicar las operaciones antes mencionadas, independientemente del tipo que actúe como parámetro real.
Se dice que una operación opera sobre un tipo, T, si produce un valor de tipo T o tiene un parámetro que, o es de tipo T, o es un access a objetos de tipo T (el parámetro debe, en este caso estar declarado como "access T", no de un tipo que sea "access T"). Los operadores y demás operaciones predefinidas en el lenguaje que operen sobre el tipo T, se dice que son "operaciones predefinidas del tipo T". El conjunto de operaciones primitivas de un tipo está constituido por sus operaciones predefinidas junto con los subprogramas primitivos definidos por el programador.
Son subprogramas primitivos de un tipo:
Un subprograma primitivo cuyo nombre es un símbolo de operador es un operador primitivo.
La jerarquía de clases de tipos de Ada 95, tal como se recoge
en la sección 3.2 del "Ada 95 Reference Manual", es:
all types
elementary
scalar
discrete
enumeration
character
boolean
other
enumeration
integer
signed integer
modular integer
real
floating point
fixed point
ordinary fixed
point
decimal fixed
point
access
access-to-object
access-to-subprogram
composite
array
string
other array
untagged record
tagged
task
protected
© Grupo de Estructuras de Datos y
Lingüística Computacional - ULPGC.
Anterior | Superior | Siguiente