Programación en Ada / Sobrecarga
De Wikilibros, la colección de libros de texto de contenido libre.
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.
Tabla de contenidos |
[editar] Sobrecarga de literales de enumeración
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;
[editar] Sobrecarga de operadores
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.
[editar] Sobrecarga de subprogramas
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;

