Programación en Ada/Sobrecarga

De Wikilibros, la colección de libros de texto de contenido libre.
← 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ón[editar]

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 operadores[editar]

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 subprogramas[editar]

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 Ada[editar]