Programación en Ada/Sobrecarga
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:
- Literales enumeración.
- Operadores.
- Subprogramas.
Sobrecarga de literales de enumeración
editarSe pueden emplear identificadores iguales en distintos tipos enumeración, por ejemplo:
declare
type
TColoris
(ROJO, VERDE, AZUL);type
TLuzis
(ROJO, AMARILLO, VERDE); Pixel: TColor; Indicador: TLuz := VERDE;begin
-- Se emplea calificador para distinguir.
Pixel := TColor'(VERDE);end
;
Sobrecarga de operadores
editarTambié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
Floatis
Resultado: Float := 0.0;begin
for
Iin
A'rangeloop
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
editarUn 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
TAlimentois
(PAN, LECHE, ACEITE);type
TProducto_Automóvilis
(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
;