Programación en Ada/Tipos derivados

← Tipos/Punteros a subprogramas Tipos derivados Tipos etiquetados →


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 S is new T;

Características

editar

Los 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:

  • 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

editar

Por ejemplo, si se tiene type TEnteroNuevo is new Integer, entonces el tipo derivado TEnteroNuevo heredará los subprogramas predefinidos como "+", "-", "abs", etc. y los atributos como First o Last.

Así, por ejemplo, se puede escribir:

type TNumManzanas is 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 TNumFrutas is Natural range 1 .. 20;
type TNumManzanas is new TNumFrutas;
type TNumPeras is 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.

Manual de referencia de Ada

editar