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