Lección 1 · 1 de 20
Clases y objetos · Pascal
Declare clases en Object Pascal con campos, métodos, constructor y destructor, y aprenda a liberar los objetos con Free en Free Pascal.

Una clase agrupa datos y el código que trabaja con ellos. TCustomer declara dos campos (Name y Orders) y tres métodos. Como no hay sección de visibilidad, todo es público. El cuerpo de cada método se escribe después, fuera de la clase, con el nombre completo: TCustomer.AddOrder.
El constructor Create reserva la memoria del objeto, la pone a cero (por eso Orders empieza en 0 y no hay que inicializarlo) y después ejecuta su código: guarda el nombre y escribe Created Ana Lopez. Se llama sobre la clase: TCustomer.Create('Ana Lopez').
El destructor Destroy lleva override porque sustituye al de TObject, la clase de la que descienden todas, y termina con inherited Destroy para que la memoria se libere. Nunca se llama directamente: se usa `Free`, que comprueba antes que la variable no sea nil y llama a Destroy.
Una variable de clase es una referencia, no el objeto. other := ana no copia al cliente: las dos variables apuntan al mismo objeto, y por eso los dos AddOrder suman en el mismo contador y la salida dice 2 orders. A diferencia de los records del curso básico, asignar no duplica nada.
Por la misma razón, el objeto se libera una sola vez. Tras ana.Free, other apunta a memoria liberada y no debe usarse. Este es el patrón de cualquier aplicación de escritorio de DMarlon Studio hecha con Lazarus: crear, usar y liberar.
Código · main.pas
program main;type TCustomer = class Name: String; Orders: Integer; constructor Create(const AName: String); destructor Destroy; override; procedure AddOrder; end;constructor TCustomer.Create(const AName: String);begin Name := AName; // Orders already starts at 0 WriteLn('Created ', Name);end;destructor TCustomer.Destroy;begin WriteLn('Freed ', Name); inherited Destroy;end;procedure TCustomer.AddOrder;begin Inc(Orders);end;var ana, other: TCustomer;begin ana := TCustomer.Create('Ana Lopez'); ana.AddOrder; other := ana; // copies the reference: still one single object other.AddOrder; WriteLn(ana.Name, ' has ', ana.Orders, ' orders'); ana.Free; // free it once; other now points to freed memoryend.Salida · fpc main.pas && ./main
Created Ana Lopez Ana Lopez has 2 orders Freed Ana Lopez
Para recordar
- Una clase declara campos y métodos; el cuerpo de los métodos va aparte.
Createreserva el objeto y pone sus campos a cero.- El destructor lleva
overridey acaba eninherited Destroy. - Libere con
Free, nunca llamando aDestroy. - Asignar un objeto copia la referencia, no el objeto.
Ejercicio
Añada a TCustomer un campo Total: Double y un método AddOrder(amount: Double) que sume el importe, y muestre el total de Ana tras dos pedidos de 25.50 y 14.99.