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
[editar]Se 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
[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
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
[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
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
;