Otra posibilidad en Delphi/Pascal es la definición de dos o más procedimientos con el mismo nombre. Para poder hacer esto los mismos deben diferir en cantidad de parámetros o tipo de parámetros.
Cuando hay procedimientos que hacen cosas similares podemos definirlos con el mismo nombre, esto ayuda a que no tengamos tantos nombres que recordar y además saber que los mismos tienen algoritmos similares.
Para definir procedimientos sobrecargados debemos agregarles al final de la declaración la palabra clave overload.
Confeccionar dos procedimientos:
Uno que reciba dos valores Integer y muestre el mayor.
Otro que reciba dos valores Double y muestre el mayor
program Proyecto101; {$APPTYPE CONSOLE} procedure MostrarMayor(x1, x2: Integer); overload; begin if x1 > x2 then begin WriteLn('Mayor:', x1); end else begin WriteLn('Mayor:', x2); end; end; procedure MostrarMayor(x1, x2: Double); overload; begin if x1 > x2 then begin WriteLn('Mayor:', x1:0:2); end else begin WriteLn('Mayor:', x2:0:2); end; end; var valor1, valor2: Integer; valor3, valor4: Double; begin Write('Ingrese primer entero:'); ReadLn(valor1); Write('Ingrese segundo entero:'); ReadLn(valor2); MostrarMayor(valor1, valor2); Write('Ingrese primer valor flotante:'); ReadLn(valor3); Write('Ingrese segundo valor flotante:'); ReadLn(valor4); MostrarMayor(valor3, valor4); ReadLn; end.
Este programa define dos métodos con el mismo nombre: "MostrarMayor", tienen la misma cantidad de parámetros pero difieren en su tipo, en uno son de tipo Integer y en el otro de tipo Double.
Es obligatorio en Delphi/Pascal agregar al final de cada procedimiento sobrecargado la palabra clave "overload":
procedure MostrarMayor(x1, x2: Integer); overload; begin if x1 > x2 then begin WriteLn('Mayor:', x1); end else begin WriteLn('Mayor:', x2); end; end; procedure MostrarMayor(x1, x2: Double); overload; begin if x1 > x2 then begin WriteLn('Mayor:', x1:0:2); end else begin WriteLn('Mayor:', x2:0:2); end; end;
Cuando llamamos a un procedimiento sobrecargado según el tipo de dato que le enviamos se ejecutará el procedimiento que tiene parámetros del mismo tipo:
MostrarMayor(valor1, valor2);
Como las variables "valor1" y "valor2" son de tipo Integer luego se ejecuta el primer procedimiento definido ya que define parámetros Integer:
procedure MostrarMayor(x1, x2: Integer); overload;
De forma similar cuando llamamos:
MostrarMayor(valor3, valor4);
Como las variables "valor3" y "valor4" son de tipo Double luego se llama al segundo procedimiento definido:
procedure MostrarMayor(x1, x2: Double); overload;
Confeccionar dos procedimientos llamados "MostrarTitulo":
Uno que reciba un String y lo muestre
Otro que reciba dos String y muestre el segundo al lado del primero pero entre paréntesis.
program Proyecto102; {$APPTYPE CONSOLE} procedure MostrarTitulo(titulo: String); overload; begin WriteLn(titulo); end; procedure MostrarTitulo(titulo, comentario: String); overload; begin WriteLn(titulo, '(', comentario, ')'); end; begin MostrarTitulo('Sistema de Ventas'); WriteLn; MostrarTitulo('Sistema de Ventas', 'Windows'); ReadLn; end.
En este problema hemos sobrecargado el nombre de procedimiento "MostrarTitulo".
Difieren en cantidad de parámetros, ahora cuando llamamos desde el bloque principal al procedimiento "MostrarTitulo" con un parámetro sabe que debe ejecutar el primer procedimiento definido:
MostrarTitulo('Sistema de Ventas');
Se ejecuta el procedimiento:
procedure MostrarTitulo(titulo: String); overload; begin WriteLn(titulo); end;
En cambio cuando llamamos:
MostrarTitulo('Sistema de Ventas', 'Windows');
Se ejecuta el procedimiento "MostrarTitulo" que define dos parámetros:
procedure MostrarTitulo(titulo, comentario: String); overload; begin WriteLn(titulo, '(', comentario, ')'); end;
procedure Incrementar(var x:Integer); overload; procedure Incrementar(var x:Integer; valor: Integer); overload;El primero incrementa el parámetro x en 1, el segundo incrementa x tanto como indica el parámetro "valor".
procedure Sumar(x1, x2: Integer); overload; procedure Sumar(Vec1, Vec2: TVector); overload;
program Proyecto103; {$APPTYPE CONSOLE} procedure Incrementar(var x:Integer); overload; begin x := x + 1; end; procedure Incrementar(var x:Integer; valor: Integer); overload; begin x := x + valor; end; var contador: Integer; begin contador := 0; WriteLn(contador); Incrementar(contador); WriteLn(contador); Incrementar(contador, 10); WriteLn(contador); ReadLn; end. program Proyecto104; {$APPTYPE CONSOLE} type TVector = array[1..5] of Integer; procedure Sumar(x1, x2: Integer); overload; var suma: Integer; begin suma := x1 + x2; WriteLn('La suma de los dos enteros es:', suma); end; procedure Sumar(Vec1, Vec2: TVector); overload; var resultado: TVector; f: Integer; begin for f:=1 to 5 do begin resultado[f] := Vec1[f] + Vec2[f]; end; WriteLn('Vector resultante de sumar dos vectores:'); for f:=1 to 5 do begin Write(resultado[f], ' '); end; end; procedure Cargar(var valor:Integer); overload; begin Write('Ingrese un valor entero:'); ReadLn(valor); end; procedure Cargar(var Vector: TVector); overload; var f: Integer; begin for f:=1 to 5 do begin Write('Ingrese elemento del Vector:'); ReadLn(Vector[f]); end; end; var Vector1: TVector; Vector2: Tvector; valor1: Integer; valor2: Integer; begin Cargar(valor1); Cargar(valor2); Sumar(valor1, valor2); WriteLn('Primer vector'); Cargar(Vector1); WriteLn('Segundo vector'); Cargar(Vector2); Sumar(Vector1, Vector2); ReadLn; end.