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∞;
Ilegal sería
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.
Véase también
Manual de referencia de Ada