Properti (Property)

Bagian ini mempelajari definisi, sintaksis, standar, dan serialisasi dari Properti (Property)

Apa itu Property

property adalah gula sintaksis bahasa Pascal. Dari luar perilakunya sama seperti field, namun di balik layar sebenarnya akan memanggil getter untuk membaca / setter untuk menulis. Fungsinya adalah mengenkapsulasi field privat, menyatukan logika baca-tulis, dan menambahkan efek samping.

  1. Properti baca-tulis terkontrol: Logika tambahan akan dijalankan otomatis saat pemberian nilai atau pengambilan nilai (penggambaran ulang antarmuka, sinkronisasi komponen, validasi angka) ;
  2. Properti hanya baca: Hanya bisa dibaca dari luar, dilarang pemberian nilai langsung; perubahan data dilakukan di dalam melalui prosedur khusus.
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'; // Kesalahan kompilasi, URL hanya bisa dibaca
  finally
    Page.Free;
  end;
  Readln;
end.Code language: HTML, XML (xml)

Di dalam kelas TWebPage, properti URL hanya dapat dibaca; untuk mengubah nilainya gunakan prosedur Load.

Properti FColorRGB mendukung pembacaan, penulisan dan perubahan nilainya bergantung pada prosedur SetColorRGB.

Selain itu PrintStatus adalah prosedur biasa yang berfungsi mencetak informasi internal dari TWebPage.

Hasil eksekusi program

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
==================Code language: JavaScript (javascript)

2. Aturan deklarasi tiga elemen properti

Dalam mendeklarasikan properti wajib menentukan cara baca, sedangkan cara tulis bersifat opsional:

read sumber pembacaan (pilih salah satu dari dua pilihan)

  • Tautan langsung ke field privat (paling cepat, tidak ada beban fungsi tambahan)
  • Fungsi getter tanpa parameter, tipe nilai balik sama persis dengan tipe properti

write sumber penulisan (opsional; jika diabaikan berarti hanya baca): pilih salah satu dari dua pilihan

  • Tautan langsung ke field privat
  • Fungsi setter dengan satu parameter, tipe parameter sama persis dengan tipe properti

Modifikator tambahan khusus serialisasi: default, stored

Kompilator akan memverifikasi kecocokan tipe secara ketat:

  • Properti tipe Integer: getter harus mengembalikan Integer tanpa parameter / read terhubung ke field privat Integer
  • Properti tipe String: setter harus menerima parameter const string

Properti Published dan Serialisasi

1. Apa itu serialisasi

Menuliskan seluruh data objek ke aliran data (berkas/memori/JSON), sehingga objek dapat dipulihkan kembali dari aliran tersebut nanti;

Berkas formulir Lazarus .lfm dan Delphi .dfm sepenuhnya bergantung pada mekanisme ini di latar belakang.

  • Syarat utama: properti harus ditempatkan di bagian published agar dapat dikenali oleh informasi tipe runtime RTTI
  • Unit utilitas pendukung:
  • LResources: membaca dan menulis berkas formulir lfm
  • FpJsonRtti / CastleComponentSerialize: serialisasi objek ke JSON

2. Modifikator Khusus Serialisasi

default <konstanta>: menandai nilai bawaan properti

  • Hanya untuk pengecekan alat serialisasi: jika nilai properti sama dengan default setelah objek dibuat, data tidak disimpan saat serialisasi untuk mengecilkan ukuran berkas
  • Tidak ada inisialisasi otomatis: konstruktor wajib memberikan nilai default ke field secara manual

stored <boolean/metode>: mengatur apakah properti disimpan saat serialisasi

  • stored True: nilai bawaan, properti akan ditulis ke berkas saat serialisasi
  • stored False: properti ini tidak akan pernah disimpan
  • stored IsNeedSave: panggil metode boolean untuk menentukan penyimpanan secara dinamis

Contoh Serialisasi

type
  TWebPage = class
  private
    FColor: TColor;
    function SetColor(const Value: TColor): TColor;
  published
    // default clBlack berarti hitam sebagai nilai bawaan; konstruktor harus tulis FColor := clBlack secara manual
    property Color: TColor read FColor write SetColor default clBlack;
    // stored False tidak akan disimpan ke lfm/json
    property TempCache: string read FTemp write FTemp stored False;
  end;

Tinggalkan Balasan

Alamat email Anda tidak akan dipublikasikan. Ruas yang wajib ditandai *