La clase TObject es una superclase que heredan todas las clases por defecto en cualquier programa, no es necesario indicar que una clase herede de TObject todos los métodos que este contiene. En esta clase se encuentran los métodos antes vistos como: Create, Destroy, Free, etc.
En este capítulo sólo se explicarán algunos de los métodos de uso más común, dejando el resto para otros capítulos. A continuación algunos de los métodos de uso más común de la clase TObject :
‒ 1. AfterConstruction y BeforeDestruction.
Son dos métodos virtuales que pueden ser sobreescritos. AfterConstruction es un método que se ejecuta después de la creación de un objeto y BeforeDestruction antes de la destrucción de un objeto. Ejemplo:
‒
Descargar
{$codepage utf8}
{$mode objfpc}
Type TMiClase=class
Constructor Crear;
Procedure AfterConstruction;override;
Procedure BeforeDestruction;override;
Destructor Destruir;
End;
Constructor TMiClase.Crear;
Begin
Writeln('Creando el Objeto')
End;
Procedure TMiClase.AfterConstruction;
Begin
Writeln('Despues de crear el objeto')
End;
Procedure TMiClase.BeforeDestruction;
Begin
Writeln('Antes de destruir el objeto')
End;
Destructor TMiClase.Destruir;
Begin
Writeln('Destruyendo el Objeto')
End;
Var MiClase01:TMiClase;
Begin
MiClase01:=TMiClase.Crear;
MiClase01.Destruir
End.
Código fuente 16: Ejemplo de AfterConstruction y BeforeDestruction.
Descargar
‒ 2. ClassName y ClassNameIs.
Son dos métodos de clase, ClassName devuelve el nombre de una clase, y ClassNameIs devuelve verdadero si un objeto es de la clase que se pasa como cadena de caracteres en su parametro, en caso contrario devuelve falso.
‒
Descargar
{$codepage utf8}
{$mode objfpc}
Type TMiClase=class
End;
TMiClase02=class(TMiClase)
End;
Var MiClase01:TMiClase;
MiClase02:TMiClase02;
Begin
MiClase01:=TMiClase.create;
MiClase02:=TMiClase02.create;
Writeln(MiClase01.classname);
Writeln(MiClase01.ClassNameIs('TMiClase'));
Writeln(MiClase01.ClassNameIs('TMiClase02'));
Writeln(MiClase02.ClassNameIs('TMiClase02'));
End.
Código fuente 17: Ejemplo de ClassName y ClassNameIs.
Descargar
‒ 3. ClassParent.
Este método de clase, devuelve una referencia de clase de la clase padre de una Clase.
‒
Descargar
{$codepage utf8}
{$mode objfpc}
Type TMiClase=class
End;
TMiClase02=class(TMiClase)
End;
Var MiClase01:TMiClase;
MiClase02:TMiClase02;
Ref: TClass;
Begin
MiClase02:=TMiClase02.create;
Writeln(MiClase02.ClassName);
ref:=MiClase02.ClassParent;
Writeln(ref.ClassName);
ref:=ref.ClassParent;
Writeln(ref.ClassName);
End.
Código fuente 18: Ejemplo de ClassParent.
Descargar
‒ 4. DefaultHandler y DefaultHandlerStr.
Estos métodos virtuales son ejecutados cuando el método Dispacth o DispacthStr, envia un mensaje que no esta implementado.
‒
Descargar
{$codepage utf8}
{$mode objfpc}
Type
TMsg=Record
MSGID : Cardinal;
Data : Pointer;
End;
TMiClase=class
Procedure DefaultHandler(var M);override;
Procedure Mensaje01(Var Msg:TMsg); Message 1;
Procedure Mensaje02(Var Msg); Message 2;
End;
TMiClase02=class(TMiClase)
End;
Procedure TMiClase.Mensaje01(Var Msg:TMsg);
Begin
Writeln('Mensaje01')
End;
Procedure TMiClase.Mensaje02(Var Msg);
Begin
Writeln('Mensaje02')
End;
Procedure TMiClase.DefaultHandler(var M);
Begin
Writeln('Cuando se despacha un mensaje que no existe este método se ejecuta')
End;
Var MiClase01:TMiClase;
MiClase02:TMiClase02;
mensaje:TMsg;
Begin
MiClase02:=TMiClase02.create;
mensaje.Msgid:=9;
mensaje.Data:=nil;
MiClase02.Dispatch(mensaje);
mensaje.Msgid:=1;
mensaje.Data:=nil;
MiClase02.Dispatch(mensaje);
End.
Código fuente 19: Ejemplo de DefaultHandler y DefaultHandlerStr.
Descargar
‒ 5. Equals.
Este método virtual, devuelve verdadero si un objeto es creado con la misma clase del otro Objeto que se compara.
‒
Descargar
{$codepage utf8}
{$mode objfpc}
Type TMiClase=class
End;
TMiClase02=class(TMiClase)
End;
Var MiClase01:TMiClase;
MiClase02:TMiClase02;
x:TMiClase;
Begin
MiClase01:=TMiClase.create;
MiClase02:=TMiClase02.create;
Writeln(MiClase01.Equals(MiClase02));
x:=MiClase01;
Writeln(MiClase01.Equals(x))
End.
Código fuente 20: Ejemplo de Equals.
Descargar
‒ 6. NewInstance, FreeInstance, InitInstance.
NewInstance es un método de clase virtual, que permite crear una nueva instancia y devuelve un TObject. FreeInstance es un método virtual que destruye la instancia u objeto creado con NewInstance. InitInstance es un método de clase que inicializa los atributos a 0 y la tabla de métodos virtuales. Estos métodos son usados internamente por Create y Destroy, respectivamente. Estos métodos son usados internamente por el Constructor de una clase, su uso es muy particular y sólo se usa cuando queramos crear constructores muy personalizados.
‒
Descargar
{$codepage utf8}
{$mode objfpc}
Type
TClase01=class
a:integer;
End;
Var A,B:TClase01;
Begin
TObject(A):=TClase01.NewInstance;
A.a:=5;
Writeln(A.a);
A.InitInstance(A);
Writeln(A.a);
A.FreeInstance;
B:=TClase01.Create;
B.a:=5;
Writeln(B.a);
B.destroy
End.
Código fuente 21: Ejemplo de NewInstance, FreeInstance, InitInstance.
Descargar
‒ 6. GetHashCode.
Es un método virtual, diseñado para que se sobrescriba y devuelva un código Hash, si este no es sobrescrito devolverá la dirección de memoria del parámetro self.
‒
Descargar
{$codepage utf8}
{$mode objfpc}
Type
TClase01=class
a:integer;
End;
Var B:TClase01;
p:longint;
Begin
B:=TClase01.Create;
p:=B.GetHashCode;
Writeln(p);
B.destroy
End.
Código fuente 22: Ejemplo de GetHashCode.
Descargar
‒ 8. InheritsFrom.
Método de clase que tiene el mismo comportamiento que el operador is, este método devuelve verdadero si el objeto es de una clase o un objeto de una de sus clases descendientes, en caso contrario devolverá falso.
‒
Descargar
{$codepage utf8}
{$mode objfpc}
Uses sysutils;
Type
TClassAvion=Class of TAvion;
TAvion=class
Procedure Despegar;virtual;abstract;
End;
TAvComercial=class(TAvion)
Procedure Despegar;override;
Procedure Publicidad;
End;
TAvCarga=class(TAvion)
Procedure Despegar;override;
End;
Procedure TAvComercial.Despegar;
Begin
Writeln('Despegando Avion Comercial');
End;
Procedure TAvComercial.Publicidad;
Begin
Writeln('PUBLICIDAD:Vuela aqui y nunca te caeras')
End;
Procedure TAvCarga.Despegar;
Begin
Writeln('Despegando Avion Carga')
End;
Var A:TAvion;
Ref:TClassAvion;
rpta:byte;
Begin
ref:=TAvion;
Write('Que avion quieres usar [1] Comercial, [2] Carga : ');readln(rpta);
Case rpta of
1: ref:=TAvComercial;
2: ref:=TAvCarga;
End;
A:=Ref.create;
try
A.Despegar;
if A.InheritsFrom(TAvComercial) then TAvComercial(A).Publicidad
else Writeln('Este avion no tiene publicidad')
except
on EAbstractError do Writeln('No es posible despegar el avion escogido');
end;
End.
Código fuente 23: Ejemplo de InheritsFrom.
Descargar
‒ 9. InstanceSize.
Este método de clase Devuelve el tamaño en bytes de un objeto más los 4 bytes propios de uso interno de la propia clase. Si deseamos saber el tamaño total de los atributos en bytes de una instancia debemos restar los 4 bytes. Este método no devuelve los bytes adicionales que pueden ser utilizados al momento de crear un objeto o instancia.
‒
Descargar
{$codepage utf8}
{$mode objfpc}
Type
TClase01=class
cad:string;
a:integer;
b:int64;
procedure mostrar;
procedure nada;
End;
procedure TClase01.mostrar;
Begin
Writeln('cad =',cad);
Writeln('a = ',a);
Writeln('b = ',b);
Writeln('tam cad =',SizeOf(cad));
Writeln('tam a =',SizeOf(a));
Writeln('tam b =',SizeOf(b));
End;
procedure TClase01.nada;
Begin
End;
Var A:TClase01;
Begin
A:=TClase01.create;
A.cad:='Hola';
A.a:=45;
A.b:=56;
A.mostrar;
Writeln(A.InstanceSize-4);
A.destroy
End.
Código fuente 24: Ejemplo de InstanceSize.
Descargar
‒ 10. ToString, UnitName.
ToString es un método virtual que permite devolver el nombre de la clase del cual se creó la instancia y UnitName devuelve el nombre de la unidad en donde se encuentra la clase en caso la clase este en un programa, este devuelve el nombre que se coloco con la palabra reservada program y si no se uso program este devuelve program. ToString es un método virtual que se suele sobrescribir, para devolver cadenas de caracteres más adecuados de los objetos descendientes.
‒
Descargar
{$codepage utf8}
{$mode objfpc}
Program Objeto-16;
Type
TClase01=class
a:integer;
End;
Var A:TClase01;
Begin
A:=TClase01.create;
Writeln(A.ToString);
Writeln(A.UnitName);
A.destroy
End.
Código fuente 25: Ejemplo de ToString, UnitName.
Descargar
Última revisión: 11/12/2013.