25 - Procedimientos: sobrecarga

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.

Problema 1

Confeccionar dos procedimientos:
Uno que reciba dos valores Integer y muestre el mayor.
Otro que reciba dos valores Double y muestre el mayor

Proyecto101

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;

Problema 1

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.

Proyecto102

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;

Problemas propuestos

  • Definir dos procedimientos llamados Incrementar:
    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".
  • Definir dos procedimientos, uno que sume dos tipos de dato Integer y lo muestre, y otro que sume dos vectores de tipo TVector con 5 elementos Integer (sumar elementos de las mismas posiciones):
    procedure Sumar(x1, x2: Integer); overload;
    
    procedure Sumar(Vec1, Vec2: TVector); overload;
    
Solución
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.