¡Recomienda esta página a tus amigos!
 
Inicio
 
Sobrecarga
Archivo PDF

Una posibilidad muy interesante que tenemos en Delphi es la de sobrecarga de procedimientos o funciones.

La sobre carga se produce cuando definimos una función o un procedimiento de distintas formas (mismo nombre de función distintos parámetros y código).

En muchas ocasiones necesitamos una función de devuelva un valor de un tipo u otro dependiendo del tipo de parámetros que la pasemos, pero conservando la filosofía de la función, un caso significativo es la función ‘Iif’ (if condición then result:=valor1 else result:=valor2) que aparecen en otros lenguajes.

¿Qué ocurre si intentamos definir dos funciones (y/o procedimientos) con el mismo nombre? El compilador se queja. Para que esto no ocurra existe en delphi la directiva ‘overload’.

Pero pasemos a un ejemplo, vamos a definir una función Iif que nos devuelve un valor u otro dependiendo de que se cumpla una condición o no.

Unit NewFunc;
interface
uses
......
type
...........
   function Iif(cond:boolean;ctrue:string;cfalse:string):string; overload;
   function Iif(cond:boolean;ctrue:integer;cfalse:integer):integer; overload;
   function Iif(cond:boolean;ctrue:double;cfalse:double):double; overload;
   function Iif(cond:boolean;ctrue:boolean;cfalse:boolean):boolean; overload;
................

implementation

..................
// La siguiente función devuelve una cadena dependiendo de la condición
function Iif(cond:boolean;ctrue:string;cfalse:string):string;
begin
   if cond then result:=ctrue else result:=cfalse;
end;
// La siguiente función devuelve un entero dependiendo de la condición
function Iif(cond:boolean;ctrue:integer;cfalse:integer):integer;
begin
   if cond then result:=ctrue else result:=cfalse;
end;
// La siguiente función devuelve un double dependiendo de la condición
function Iif(cond:boolean;ctrue:double;cfalse:double):double;
begin
   if cond then result:=ctrue else result:=cfalse;
end;
// La siguiente función devuelve un boolean (true/false) dependiendo de la condición
function Iif(cond:boolean;ctrue:boolean;cfalse:boolean):boolean;
begin
   if cond then result:=ctrue else result:=cfalse;
end;
....................
end.

Ejemplos :

Var
   A: string;
   B: Double;
   C: Integer;
Begin
   A:=iif(vari=’P’,’Pepe’,’Juan’);
   B:=iif(vari=’P’,2.3,1.23);
   C:=iif(vari=’P’,1,2);
End;

Si vari vale P entonces :

A vale ‘Pepe’

B vale 2.3

C vale 1

Pero las funciones y/o procedimientos sobrecargados no tienen por qué tener el mismo número de parámetros como vamos a ver en el siguiente ejemplo.

Vamos a definir una función del tipo Decode de Oracle, esta función es una especie de ‘Case’ en el cual dependiendo de el valor de un parámetro devolverá un valor. Ejemplo en oracle :

Decode(valor, ‘pepe’, ‘lopez’,’juan’,’sanz’,’lola’,’diaz’,’apellido desconocido’)

Esta función devuelve :

Valor

valor devuelto

Pepe

lopez

Juan

sanz

lola

diaz

<resto>

apellido desconocido

 

en nuestro caso vamos a definir esta función para cadenas (string) de dos formas distintas, sobrecargando la función :

Unit NewFunc1;
interface
uses
......
type
...........
   // Con cuatro parámetros
   function Decode(cond:string;valores:array of string;results:array of string; ifnoexist:string):string;overload;
   // Con tres parámetros
   function Decode(cond:string;valores:array of string; ifnoexist:string):string;overload;

................

implementation

..................

function Decode(cond:string;valores:array of string;ifnoexist:string):string;
   var i:integer;
begin
   result:=ifnoexist;
   i:=low(valores);
   while i<high(valores) do
   begin
      if valores[i]=cond then
      begin
         result:=valores[i+1];
         break;
      end;
      i:=i+2;
   end;
end;
function Decode(cond:string;valores:array of string;results:array of string; ifnoexist:string):string;
   var i:integer;
begin
   result:=ifnoexist;
   for I:=low(valores) to high(valores) do
      if valores[i]=cond then
      begin
         result:=results[i];
         break;
      end;
end;

Ejemplos :

Var
   A: string;
   B: String;
Begin
   A:=decode(vari,[’PP’,’QST’,’WRD’],[’Pepe’,’Quest’,’Word’],’Nose’);
   B:=decode(vari,[’PP’, ’Pepe’, ’QST’, ’Quest’, ’WRD’, ’Word’], ’Nose’);
End;

Esta funcion devuelve en los dos casos:

Valor

valor devuelto

PP

Pepe

QST

Quest

WRD

Word

<resto>

Nose

Hay que tener cuidado cuando definimos una función sobrecargada en la cual uno de los parámetros tiene un valor por defecto poeque la definición podría ser ambigua :

Procedure Pp(a:integer;b: char = ‘B’);overload;

Procedure Pp(a:integer);overload;

Begin
   Pp(2);
End;

Esto daría un error, ya que al tener el parámetro b por defecto el valor ‘B’, el compilador no sabría cual es el procedimiento al que tiene que invocar, para solucionarlo basta con quitar el valor por defecto.