# Programación en Ada/Tipos etiquetados

Ada 83 fue diseñado para dar soporte a desarrollos de sistemas empotrados, de tiempo real y misión crítica. Para este tipo de trabajos, las características de Ada, como el tipado fuerte y la división en paquetes, permitían el uso de una serie de metodologías de desarrollo, con un razonable grado de comodidad. Sin embargo, en los años 90, el advenimiento de la programación orientada a objectos, hizo necesario que Ada se extendiera para dar cabida a esta nueva metodología. Esto debido, a que la programación orientada a objeto necesitaba de un soporte en el manejo de tipos y en la visibilidad de los métodos, que Ada 83 hubiera considerado como no permitido.
Los cambios necesarios, fueron incorporados al siguiente estándar: Ada 95.
Básicamente, los cambios se centraron alrededor del uso de los tipos etiquetados, una construcción software que añade flexibilidad al tipado fuerte, justo en grado necesario para permitir representar en Ada un diagrama de objectos, por ejemplo, en UML.
Los tipos etiquetados de Ada 95 son los que permiten realizar el polimorfismo. A menudo se asimila la combinación de un tipo etiquetado y el paquete que lo contiene a una clase en otros lenguajes de programación también orientados a objetos. Sin embargo hay algunas diferencias de sintaxis, que no de filosofía general, que veremos en este apartado.
Un tipo etiquetado puede ser un registro de modo que su estructura es pública, o puede ser un tipo privado, aunque en la parte privada siempre se termina definiendo como un registro.
Un tipo etiquetado se puede extender.
El nuevo tipo hereda todos las operaciones primitivas del tipo base y las puede redefinir.
Todo objeto de un tipo etiquetado contiene una etiqueta (tag) que permite reconocer su tipo en tiempo de ejecución.

## Tipos polimórficos (class-wide type)

En Ada el polimorfismo se consigue con un tipo especial que puede contener objetos de cualquier tipo derivado de uno dado. Estos tipos especiales se indican con el atributo Class, es decir, T_Base'Class puede almacenar cualquier objeto derivado del tipo T_Base.
Este tipo de la clase es un tipo irrestringido, es decir, para declarar un objeto de este tipo tenemos que inicializarlo llamando a una función, asignándole otro objeto o con un new (si es un puntero a tipo polimórfico, es decir, access all T_Base'Class).

## Llamadas que despachan

La ventaja del polimorfismo es poder escribir algoritmos que no dependen del tipo concreto de los objetos que se manejan.
El polimorfismo dinámico que proporciona la programación orientada a objetos permite que una operación sobre un objeto polimórfico se realice de distinto modo dependiendo del tipo concreto del objeto de que se trate en la ejecución. Otras formas de polimorfismo son el polimorfismo paramétrico que se implementa en Ada con las unidades genéricas y el polimorfismo por sobrecarga.
En Ada este polimorfismo se consigue llamando a una operación primitiva de un objeto polimórfico. Cuando el objeto sobre el que se realiza la operación es polimórfico y el parámetro formal del subprograma llamado es concreto, el subprograma realmente llamado puede ser uno redefinido para el tipo concreto si se ha redefinido para él una implementación distinta de la del tipo base.
Nota para programadores de C++: esto quiere decir que en Ada todos los "métodos" son virtuales, pero no todas las llamadas son virtuales, sólo las que llaman a un método de un objeto polimórfico (semejante a un puntero a clase base).

## Manual de referencia de Ada

* 3.9 Tagged Types and Type Extensions
* 3.9.1 Type Extensions
* 3.9.2 Dispatching Operations of Tagged Types