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:
declaretypeTColoris(ROJO, VERDE, AZUL);typeTLuzis(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)returnFloatisResultado: Float := 0.0;beginforIinA'rangeloopResultado := Resultado + A(I) * B(I);endloop;returnResultado;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:
declaretypeTAlimentois(PAN, LECHE, ACEITE);typeTProducto_Automóvilis(ACEITE, BUJÍA);procedureComprar (ProdAlim: TAlimento)is-- ...procedureComprar (ProdAutom: TProducto_Automóvil)is-- ...beginComprar (ACEITE);-- Ambigüedad.Comprar (TAlimento'(ACEITE));-- Se supera la ambigüedad.Comprar (ProdAlim => ACEITE);-- También se supera la ambigüedad.end;