‒ Parametros opcionales y uso de self.
Los parámetros opcionales, son una característica que también se puede usar con los procedimientos y funciones, siempre y cuando se incluya la directiva {$mode objfpc}.
Los parámetros opcionales en este capítulo se explicarán con métodos. Los parámetros opcionales nos permiten crear métodos en donde a un parámetro se le puede dar un valor predeterminado, para después usar el método con o sin el parámetro, ya que este parámetro es opcional. Para colocar un parámetro opcional este se debe colocar al final de la lista de parámetros, y colocar un valor después de la definición del tipo de dato con el símbolo igual. Ejemplo:
TClase=Class
Procedure MetodoA(var a:integer, b:integer=5)
End;
Los parámetros opcionales no pueden ser parámetros por referencia (var), En este ejemplo el métodoA, se puede usar del siguiente modo:
Objeto.MetodoA(b);
ó
Objeto.MetodoA(b,7);
Cuando se usan métodos con más de un parámetro opcional, no se pueden saltar algunos parámetros. Es decir si se define el siguiente método:
TClase=Class Procedure Metodo(var a:integer; B:integer=1; c:char='x') End;
Lo siguiente generará un error de compilación:
Objeto.Metodo(b,,'f');
Cuando se usen parámetros opcionales con métodos sobrecargados es importante no hacer métodos ambiguos, por ejemplo considera la siguiente definición de métodos:
TClase=Class
procedure Metodo(a:real; B:integer = 0);
procedure Metodo(a:real);
End;
El compilador compilará la clase y también permitirá la creación del objeto, pero cuando se intente usar el método:
Objeto.Metodo(5)
El compilador avisará de la inusual situación, para que se hagan los cambios pertinentes.
Los parámetros opcionales se limitan a los tipos de datos Números Enteros, Booleanos, Caracteres, Reales, y el tipo de dato string. Los registros, Conjuntos, Enumerados, Subrangos, arreglos estáticos no están permitidos. En el caso de los punteros el único valor predeterminado que es posible asignar es nil.
En el caso de los tipos de datos Pchar, PwideChar, AnsiString y UnicodeString estos se comportan como el tipo de dato string.
En el caso de un arreglo dinámico, este debe definirse como un tipo de dato y usarlo como parámetro, pero sólo se le puede asignar como valor predeterminado nil, ya que se le considera como un puntero. Ejemplo:
Type
Tlista=array of integer;
TClase=Class
procedure Metodo(a:real; cad:ansistring='Hola';Lista:Tlista=nil);
End;
Con respecto a los arreglos abiertos (open array), estos no se pueden usar como parámetros opcionales.
En las clases que hemos estado desarrollando TComplejo y TReal, se tiene el método ObtCad, este tiene un parámetro, que nos indica la cantidad de decimales con el que nos debe mostrar el número, este parámetro puede ser un parámetro opcional, en donde el método se cambiaría por:
Function ObtCad(dec:integer=0):string;
Este cambio se debe hacer en ambas clases TReal y TComplejo.
Otro cambio que se puede hacer a la clase TComplejo, será sobrecargar el método cuadrado con uno sin parámetros, para ello se hará uso de la palabra reservada self. El nuevo método será:
Procedure TComplejo.Cuadrado;
Begin
Multiplicacion(self)
End;
Este método sobrecarga al ya existente, y nos permite elevar al cuadrado el número actual colocado en el objeto, a diferencia del otro que eleva al cuadrado un número colocado en su parámetro.
Para poder hacer este cambio, se hace uso de self, self es un parámetro oculto que es una referencia al objeto actual, todos los métodos tienen este parámetro. Debido a que una clase puede ser instanciado por varios objetos, como por Ejemplo:
Var A,B,C : TComplejo
Cuando se use el método cuadrado, self será reemplazado por A,B y C. cuando se ejecute el programa.
A continuación, las clases TComplejo y TReal con los cambios indicados: