Programación en Ada/Tipos/Registros variantes
Puede interesar que un registro contenga partes de su estructura que
puedan variar en función de otras. Para ello se definen los registros variantes que son un tipo especial de registros discriminados en los que la existencia de algunos campos depende del valor del discriminante.
Por ejemplo:
declare type TTipoVuelo is (MILITAR, CIVIL, ENEMIGO, DESCONOCIDO); type TRegistroVuelo (Clasif: TTipoVuelo) is record Velocidad: Float; Detalles: String(1..100); case Clasif is when CIVIL => null; when MILITAR => Origen, Destino: String(1..10); when ENEMIGO | DESCONOCIDO => NivelAmenaza: Integer; end case; end record; Vuelo1: TRegistroVuelo (MILITAR); begin Vuelo1.Origen := "Francia "; end;
Sería ilegal la asignación Vuelo1.NivelAmenaza := 1;
pues dicho campo sólo es válido
para DESCONOCIDO
o ENEMIGO
.
Si el discriminante lleva un valor por defecto entonces el registro es variante durante su ciclo de vida (es mutable). Si no, el valor del discriminante se fija en su declaración y no varía durante la vida del objeto.
Los registros variantes en cierto modo están sobrepasados por la extensión de los tipos etiquetados, sin embargo aún son útiles en casos simples como aquellos en los que se conocen todas las posibilidades y no se desea que alguien añada una derivación a posteriori.