Programación en Ada/Sobrecarga

← Subprogramas Sobrecarga Tipos/Registros discriminados →


En Ada se puede utilizar un identificador con más de un significado. Esto es lo que se conoce como sobrecarga. Los identificadores que se pueden sobrecargar son:

Sobrecarga de literales de enumeraciónEditar

Se pueden emplear identificadores iguales en distintos tipos enumeración, por ejemplo:

declare
   type TColor is (ROJO, VERDE, AZUL);
   type TLuz is (ROJO, AMARILLO, VERDE);
   Pixel: TColor;
   Indicador: TLuz := VERDE;
begin
   -- Se emplea calificador para distinguir.
   Pixel := TColor'(VERDE);
end;

Sobrecarga de operadoresEditar

También se puede utilizar una función para definir una operación y sobrecargar cualquiera de los operadores ya establecidos excepto /= (que toma su valor a partir del operador =, pero que puede redefinirse si el valor de retorno no es de tipo Boolean). Por ejemplo, se puede hacer una función "*" que multiplique escalarmente dos vectores:

function "*" (A, B: Vector) return Float is
  Resultado: Float := 0.0;
begin
  for I in A'range loop
    Resultado := Resultado + A(I) * B(I);
  end loop;
  return Resultado;
end "*";

Las reglas a cumplir a la hora de sobrecargar un operador son:

  • No cambiar la sintaxis.
  • No cambiar el número de parámetros de un operador (recuérdese que + y - pueden ser unarios o binarios).
  • La precedencia se mantiene.

Por otro lado, una recomendación muy importante es no definir un operador para un nuevo tipo dándole un significado distinto al del operador predefinido. Es decir, + siempre ha de representar conceptos relacionados con la adición; *, multiplicación; and, conjunción, etc.

Sobrecarga de subprogramasEditar

Un subprograma sobrecargará un significado ya existente siempre que su especificación sea suficientemente diferente, es decir, pueden existir dos subprogramas con el mismo identificador siempre que se distingan por el número o tipo de sus parámetros. Por ejemplo:

declare
  type TAlimento is (PAN, LECHE, ACEITE);
  type TProducto_Automóvil is (ACEITE, BUJÍA);
  procedure Comprar (ProdAlim: TAlimento) is  -- ...
  procedure Comprar (ProdAutom: TProducto_Automóvil) is  -- ...
begin
  Comprar (ACEITE);  -- Ambigüedad.
  Comprar (TAlimento'(ACEITE));  -- Se supera la ambigüedad.
  Comprar (ProdAlim => ACEITE);  -- También se supera la ambigüedad.
end;

Manual de referencia de AdaEditar