Clase, instancia de clase, constructor, destructor
El ejemplo anterior incluye TAnimal y su subclase TDog. Una clase es simplemente un tipo, que se puede entender como una plantilla. La clase en sí no almacena ningún dato y no se asigna memoria al campo MyInt: Integer del ejemplo.
Aunque las variables de clase permiten que la propia clase contenga datos, no trataremos este punto ahora y solo explicaremos las clases normales con campos ordinarios.
Para asignar memoria a los campos debes crear una instancia de clase; crear una instancia requiere invocar un constructor.
Si nunca creas una instancia de una clase, su código es como si no existiera: no se ejecuta ni se asigna memoria a sus variables. Se puede comparar una clase con un molde: solo se reserva memoria cuando se usa, y cuando no se utiliza permanece sin consumir recursos.
Constructor
- Método especial declarado con la palabra clave
constructor; - El sistema asigna primero la memoria del objeto y luego ejecuta el código del constructor;
- Todas las clases heredan implícitamente de
TObjecty traen un constructor sin parámetrosCreatedisponible sin definirlo manualmente; - Los constructores personalizados son la mejor forma de inicializar objetos y permiten asignar valores iniciales a los campos;
- Los constructores personalizados reciben convencionalmente el nombre
Create.
Ejemplo
program Demo;
{$ifdef FPC} {$mode objfpc}{$H+}{$J-} {$endif}
{$ifdef MSWINDOWS} {$apptype CONSOLE} {$endif}
{$codepage utf8}
uses SysUtils;
type
TAnimal = class
private
InternalStuff: TObject;
public
constructor Create;
destructor Destroy; override;
end;
constructor TAnimal.Create;
begin
inherited Create; // Llamar primero al constructor padre
InternalStuff := TObject.Create;
Writeln('Ejecutar el constructor TAnimal.Create');
end;
destructor TAnimal.Destroy;
begin
Writeln('Ejecutar el destructor TAnimal.Destroy');
FreeAndNil(InternalStuff); // Liberar el subobjeto interno
inherited Destroy; // Llamar al destructor padre al final
end;
var
C: TAnimal;
begin
C := TAnimal.Create;
try
// Usar el objeto
finally
FreeAndNil(C); // Invocar automáticamente el destructor Destroy
end;
end.
Salida de ejecución
D:\fpcdemo>fpc mydemo.dpr
Free Pascal Compiler version 3.2.2 [2021/05/15] for i386
Copyright (c) 1993-2021 by Florian Klaempfl and others
Target OS: Win32 for i386
Compiling mydemo.dpr
Linking mydemo.exe
38 lines compiled, 0.1 sec, 68672 bytes code, 4260 bytes data
D:\fpcdemo>mydemo
Ejecutar el constructor TMyClass.Create
Ejecutar el destructor TMyClass.DestroyLenguaje del código: CSS (css)
InternalStuff es un subobjeto contenido internamente por la clase. Se crea en el constructor y debe liberarse con FreeAndNil en el destructor para evitar fugas de memoria.
