Programación en Ada/Tipos/Registros variantes

← Tipos/Registros discriminados Registros variantes Tipos/Punteros a objetos →


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.

Véase también

editar

Manual de referencia de Ada

editar