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.