Propiedad (Property)

En esta sección estudiamos la definición, sintaxis, normas y serialización de propiedades (Property)

¿Qué es una Property

property es azúcar sintáctico de Pascal. Por fuera se comporta como un campo, pero internamente invoca realmente un getter para lectura / setter para escritura. Sirve para encapsular campos privados, unificar lógica de lectura y escritura y añadir efectos secundarios.

  1. Propiedad de lectura y escritura controlable: Se ejecuta lógica extra automáticamente al asignar o leer valores (redibujado de interfaz, sincronización de componentes, validación numérica) ;
  2. Propiedad solo lectura: Solo se puede leer desde el exterior, prohibida la asignación directa; los datos se modifican internamente mediante procedimientos dedicados.
program Demo;
{$ifdef FPC} {$mode objfpc}{$H+}{$J-} {$endif}
{$ifdef MSWINDOWS} {$apptype CONSOLE} {$endif}
uses
  SysUtils;

type
  TWebPage = class
  private
    FURL: string;
    FColorRGB: Integer;
    procedure SetColorRGB(const Value: Integer);
  public
    property URL: string read FURL;
    property ColorRGB: Integer read FColorRGB write SetColorRGB;

    procedure Load(const AnURL: string);
    procedure PrintStatus;
  end;

procedure TWebPage.Load(const AnURL: string);
begin
  FURL := AnURL;
  Writeln('Load page: ', AnURL);
end;

procedure TWebPage.SetColorRGB(const Value: Integer);
begin
  if FColorRGB <> Value then
  begin
    FColorRGB := Value;
    Writeln('Color updated, value = ', Value);
    Writeln('Sync component color to ', Value);
  end;
end;

procedure TWebPage.PrintStatus;
begin
  Writeln('==== Page Info ====');
  Writeln('URL(read-only): ', URL);
  Writeln('ColorRGB(rw): ', ColorRGB);
  Writeln('==================');
  Writeln;
end;

var
  Page: TWebPage;
begin
  Page := TWebPage.Create;
  try
    Page.Load('https://www.foxdevelop.com/');
    Page.ColorRGB := 255;
    Page.PrintStatus;

    Page.ColorRGB := 255;
    Page.PrintStatus;

    Page.ColorRGB := 65535;
    Page.PrintStatus;

    // Page.URL := 'test'; // Error de compilación, URL es solo lectura
  finally
    Page.Free;
  end;
  Readln;
end.Lenguaje del código: HTML, XML (xml)

En TWebPage la propiedad URL es solo lectura; para modificarla se usa el procedimiento Load.

La propiedad FColorRGB admite lectura, su escritura o modificación depende del procedimiento SetColorRGB.

Además PrintStatus es un procedimiento común que sirve para imprimir la información interna de TWebPage.

Resultado de ejecución

Load page: https://www.foxdevelop.com/
Color updated, value = 255
Sync component color to 255
==== Page Info ====
URL(read-only): https://www.foxdevelop.com/
ColorRGB(rw): 255
==================

==== Page Info ====
URL(read-only): https://www.foxdevelop.com/
ColorRGB(rw): 255
==================

Color updated, value = 65535
Sync component color to 65535
==== Page Info ====
URL(read-only): https://www.foxdevelop.com/
ColorRGB(rw): 65535
==================Lenguaje del código: JavaScript (javascript)

2. Reglas de declaración de los tres elementos de una propiedad

Al declarar una propiedad es obligatorio especificar el modo de lectura; el modo de escritura es opcional:

read origen de lectura: elegir una de dos opciones

  • Enlace directo a un campo privado (máxima velocidad, sin gasto extra de funciones)
  • Función getter sin parámetros, cuyo tipo de retorno coincide totalmente con el tipo de la propiedad

write origen de escritura (opcional, si se omite es solo lectura): elegir una de dos opciones

  • Enlace directo a un campo privado
  • Función setter con un único parámetro, tipo del parámetro idéntico al de la propiedad

Modificadores adicionales exclusivos para serialización: default, stored

El compilador fuerza la comprobación de coincidencia de tipos:

  • Propiedad Integer: el getter debe devolver Integer sin parámetros / read enlazado a campo privado Integer
  • Propiedad String: el setter debe recibir un parámetro const string

Propiedades Published y serialización

1. ¿Qué es la serialización

Escribir todos los datos de un objeto en un flujo (archivo/memoria/JSON) para restaurar el objeto desde ese flujo después ;

Los archivos de formulario Lazarus .lfm y Delphi .dfm dependen totalmente de este mecanismo interno.

  • Requisito fundamental: la propiedad debe estar en la sección published para que la información de tipo en tiempo de ejecución RTTI la reconozca
  • Unidades de utilidad asociadas:
  • LResources: leer y escribir archivos lfm de formularios
  • FpJsonRtti / CastleComponentSerialize: serialización JSON de objetos

2. Modificadores exclusivos para serialización

default <constante>: marca el valor por defecto de la propiedad

  • Solo para evaluación de herramientas de serialización: si el valor de la propiedad coincide con default tras crear el objeto, se omite su almacenamiento en serialización para reducir tamaño de archivo
  • No hay inicialización automática: el constructor debe asignar manualmente al campo el valor correspondiente a default

stored <booleano/método>: controla si la propiedad se guarda durante la serialización

  • stored True: valor por defecto, se escribe la propiedad en el archivo al serializar
  • stored False: nunca se guarda esta propiedad
  • stored IsNeedSave: llama a un método booleano para decidir dinámicamente el almacenamiento

Ejemplo de serialización

type
  TWebPage = class
  private
    FColor: TColor;
    function SetColor(const Value: TColor): TColor;
  published
    // default clBlack representa negro por defecto; el constructor debe asignar manualmente FColor := clBlack
    property Color: TColor read FColor write SetColor default clBlack;
    // stored False no guarda en lfm/json
    property TempCache: string read FTemp write FTemp stored False;
  end;

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *