DMarlon Studio

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.

Pascal · Clases y objetos en DMarlon Studio: el código del ejemplo y su salida en la terminal

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.
  • Create reserva el objeto y pone sus campos a cero.
  • El destructor lleva override y acaba en inherited Destroy.
  • Libere con Free, nunca llamando a Destroy.
  • 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.