‒ Referencias de clase.
Una referencia de clase es un tipo de dato que definimos para que se pueda crear una variable, que permita guardar una clase en dicha variable, es decir la dirección de memoria de dicha clase. Una de las cualidades de esta característica es que nos permite crear objetos a partir de la clase que se guarde en una variable.
Veamos un ejemplo simple, suponiendo que hemos creado la clase TClaseA, entonces podemos definir una referencia de clase, del siguiente modo:
Type
TClaseAClass=Class of TClaseA;
Ahora declaramos dos variables una que será un objeto y la otra una clase.
Var
ClaseAClass:TClaseAClass;
ObjetoA:TClaseA
Luego asignamos la clase y creamos el objeto:
ClaseAClass:=TClaseA
ObjetoA:=ClaseAClass.create
Como podemos observar en ves de usar TClaseA.create hemos usado la variable que almacena la clase, y no la clase misma para hacerlo.
Las Referencias de clase no serían útiles si estos no hacen uso de la misma compatibilidad entre objetos. Cuando creamos una variable que es una referencia de clase como ClaseAClass, podemos asignarle a esta variable cualquier clase que sea descendiente de la clase TClaseA. Es decir si TClaseB es descendiente de TClaseA, entonces esto también es valido:
ClaseAClass:=TClaseB
Freepascal declara varias referencias de clase en sus librerias, como son: TClass y ExceptionClass, que son referencias de clase de las clases Tclass y Exception. Y se declaran de la siguiente manera:
TClass = Class of TObject;
ExceptClass=Class of Exception;
El tipo de referencia de clase TClass, se puede usar para almacenar cualquier clase escrita en freepascal, ya que toda clase es descendiente de TObject. Explicado todo lo anterior observemos ahora el siguiente programa:
En este programa hacemos uso de las classes TNumero, TComplejos y TReal, visto en los capítulos anteriores, lo primero que se puede observar es la variable Ref:TClassNumero, en donde TClassNumero es un referencia de clase de la Clase TNumero.
El programa pide al usuario sobre que numero se hará la multiplicación, si se hará con un numero Complejo o Real, y haciendo uso de la referencia de clases, se escoge que clases usar para crear los números y realizar la operación.
Algo importante es que si la variable almacena la clase TComplejo, esto no significa que podamos usar los métodos y atributos que tiene esta clase, sólo se pueden usar los métodos y atributos de la clase padre, que en este caso es TNumero. Es decir hacer esto no es posible.
Num1:=Ref.crear(0,0);
y el compilador generará un error indicandonos que el método crear no es miembro de la clase a la que se hace referencia. La unidades y el programa de ejemplo de este capitulo se pueden descargar desde este enalce: 11-04-Ejemplo.zip