Programación en Ada/Tipos derivados
Hay ocasiones en las que es útil introducir un tipo nuevo que es similar en la mayoría de los aspectos a uno ya existente, pero que es un tipo distinto. Con la siguiente sentencia, se dice que S es un tipo derivado de T:
type
Sis
new
T;
Características
editarLos aspectos que definen a un tipo son su conjunto de valores y su conjunto de operaciones. El conjunto de valores de un tipo derivado es una copia del conjunto de valores del progenitor y, al ser copia, no pueden asignarse entre ambos. El conjunto de operaciones aplicables a un tipo derivado son:
- Los atributos son los mismos.
- A no ser que el tipo progenitor sea limitado, posee la asignación, igualdad y desigualdad predefinidas.
- El tipo derivado heredará los subprogramas primitivos del tipo progenitor, es decir, los subprogramas que tengan algún parámetro o un resultado de dicho tipo, y bien sean predefinidos o estén definidos en el mismo paquete que el tipo progenitor.
Estas operaciones heredadas, a efectos de uso, es como si estuvieran definidas en la misma región declarativa que el tipo derivado.
Ejemplo
editarPor ejemplo, si se tiene
, entonces el
tipo derivado TEnteroNuevo heredará los subprogramas predefinidos como
"+", "-", "abs", etc. y los atributos como First o Last.
type
TEnteroNuevo is
new
Integer
Así, por ejemplo, se puede escribir:
type
TNumManzanasis
new
Integer; NumManzanas: TNumManzanas;-- ...
NumManzanas := NumManzanas + 1;
Como puede observarse, se hace uso del operador "+" predefinido para el tipo Integer.
Tipos derivados frente a subtipos
editar¿Cuándo crear un tipo derivado en vez de un subtipo? Cuando queremos tener un nuevo tipo cuyos valores no deseamos que se confundan con los del tipo original pero queremos que posea las mismas operaciones y la misma representación que el tipo base. Por ejemplo:
-- Supongamos que tenemos cajas en las que caben 20 piezas de frutas
subtype
TNumFrutasis
Naturalrange
1 .. 20;type
TNumManzanasis
new
TNumFrutas;type
TNumPerasis
new
TNumFrutas; NumManzanas: TNumManzanas; NumPeras: TNumPeras; NumFrutas: TNumFrutas;-- ...
-- Error de compilación, no podemos juntar peras con manzanas:
NumManzanas := NumManzanas + NumPeras;-- Ilegal
-- Pero siempre podemos contabilizarlos como frutas convirtiendo al tipo
-- base:
NumFrutas := TNumFrutas (NumManzanas) + TNumFrutas (NumPeras);
Nota para programadores de C/C++: typedef
realmente no define un tipo, sino que define un nuevo nombre para un mismo tipo, algo parecido al subtype, pero nada que ver con el
.
type
S is
new
T