|  
      
      
      
       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. 
     | 
      |