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;