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
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
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
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