Código en Delphi 6, válido para Delphi for win32 y CodeGear RAD Studio (Delphi win32) | ||
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.Si vari vale P entonces :
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;
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;overload; 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;
BeginEsto 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.