Cómo funcionan los parámetros de sobrecarga y predeterminados en Delphi

Las funciones y procedimientos son una parte importante del lenguaje Delphi. Comenzando con Delphi 4, Delphi nos permite trabajar con funciones y procedimientos que soportan parámetros por defecto (haciendo que los parámetros sean opcionales), y permite que dos o más rutinas tengan un nombre idéntico, pero operen como rutinas completamente diferentes.

Veamos cómo la sobrecarga y los parámetros por defecto pueden ayudarle a codificar mejor.

Sobrecarga

En pocas palabras, sobrecargar es declarar más de una rutina con el mismo nombre. La sobrecarga nos permite tener múltiples rutinas que comparten el mismo nombre, pero con un número diferente de parámetros y tipos.

Como ejemplo, consideremos las dos funciones siguientes:

 {Overloaded routines must be declared

with the overload directive}

function SumAsStr(a, b :integer): string; overload;

begin

   Result := IntToStr(a + b) ;

end;

function SumAsStr(a, b : extended; Digits:integer): string; overload;

begin

   Result := FloatToStrF(a + b, ffFixed, 18, Digits) ;

end;

Estas declaraciones crean dos funciones, ambas llamadas SumAsStr, que toman un número diferente de parámetros y son de dos tipos diferentes. Cuando llamamos a una rutina sobrecargada, el compilador debe ser capaz de decir a qué rutina queremos llamar.

 

Por ejemplo, SumAsStr(6, 3) llama a la primera función SumAsStr, porque sus argumentos están valorados en números enteros.

Nota: Delphi le ayudará a elegir la implementación correcta con la ayuda de la finalización y la comprensión del código.

Por otro lado, considere si intentamos llamar a la función SumAsStr de la siguiente manera:

 SomeString := SumAsStr(6.0,3.0)

Obtendremos un error que dice: "No hay una versión sobrecargada de'SumAsStr' que pueda ser llamada con estos argumentos." Esto significa que también debemos incluir el parámetro Dígitos utilizado para especificar el número de dígitos después del punto decimal.

Nota: Sólo hay una regla para escribir rutinas sobrecargadas, y es que una rutina sobrecargada debe diferir en al menos un tipo de parámetro. La clase de devolución, en cambio, no se puede utilizar para distinguir entre dos rutinas.

Dos unidades - Una rutina

Supongamos que tenemos una rutina en la unidad A, y la unidad B usa la unidad A, pero declara una rutina con el mismo nombre. La declaración en la unidad B no necesita la directiva de sobrecarga - deberíamos usar el nombre de la unidad A para calificar las llamadas a la versión A de la rutina de la unidad B.

Considere algo como esto:

 unit B;

...

uses A;

...

procedure RoutineName;

begin

  Result := A.RoutineName;

end;

Una alternativa al uso de rutinas sobrecargadas es usar parámetros por defecto, lo que usualmente resulta en menos código para escribir y mantener.

Parámetros por defecto/opcionales

Para simplificar algunas sentencias, podemos dar un valor por defecto para el parámetro de una función o procedimiento, y podemos llamar a la rutina con o sin el parámetro, haciéndolo opcional. Para proporcionar un valor por defecto, finalice la declaración de parámetros con el símbolo igual (=) seguido de una expresión constante.

Por ejemplo, dada la declaración

 function SumAsStr (a,b : extended; Digits : integer = 2) : string;

the following function calls are equivalent.

 

 SumAstr(6.0, 3.0)

 SumAstr(6.0, 3.0, 2)

Nota: Los parámetros con valores por defecto deben aparecer al final de la lista de parámetros, y deben pasarse por valor o como const. Un parámetro de referencia (var) no puede tener un valor por defecto.

Cuando se llaman rutinas con más de un parámetro por defecto, no podemos omitir parámetros (como en VB):

 function SkipDefParams(var A:string; B:integer=5, C:boolean=False):boolean;

...

//this call generates an error message

CantBe := SkipDefParams('delphi', , True) ;

Sobrecarga con parámetros por defecto

Cuando utilice tanto la sobrecarga de funciones o procedimientos como los parámetros predeterminados, no introduzca declaraciones de rutina ambiguas.

Considere las siguientes declaraciones:

 procedure DoIt(A:extended; B:integer = 0) ; overload;

procedure DoIt(A:extended) ; overload;

La llamada al procedimiento DoIt como DoIt(5.0), no compila. Debido al parámetro por defecto en el primer procedimiento, esta sentencia podría llamar a ambos procedimientos, ya que es imposible saber qué procedimiento debe llamarse.

(0 votes)