Eigenschaft (Property)

In diesem Abschnitt lernen wir die Definition, Syntax, Regeln und Serialisierung von Eigenschaften (Property)

Was ist eine Property

property ist syntaktischer Zucker in Pascal. Nach außen verhält es sich wie ein Feld, intern werden aber tatsächlich Getter zum Lesen / Setter zum Schreiben aufgerufen. Es dient zum Kapseln privater Felder, Vereinheitlichen von Lese-/Schreiblogik und Hinzufügen von Nebeneffekten.

  1. Steuerbare Lese-Schreib-Eigenschaft: Bei Zuweisung oder Wertabruf wird automatisch zusätzliche Logik ausgeführt (Oberflächenneuzeichnung, Komponentensynchronisation, Wertprüfung) ;
  2. Schreibgeschützte Eigenschaft: Von außen nur lesbar, direkte Zuweisung unzulässig; Daten werden intern über spezielle Prozeduren geändert.
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'; // Kompilierfehler, URL ist schreibgeschützt
  finally
    Page.Free;
  end;
  Readln;
end.Code-Sprache: HTML, XML (xml)

In TWebPage ist die URL-Eigenschaft nur lesbar; zum Ändern wird die Prozedur Load verwendet.

Die Eigenschaft FColorRGB kann gelesen werden, das Schreiben/Ändern läuft über die Prozedur SetColorRGB.

Zusätzlich ist PrintStatus eine gewöhnliche Prozedur zur Ausgabe interner Informationen von TWebPage.

Ausgabeergebnis der Ausführung

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-Sprache: JavaScript (javascript)

2. Deklarationsregeln der drei Bestandteile einer Property

Bei der Deklaration einer Eigenschaft muss die Lesemethode angegeben werden, die Schreibmethode ist optional:

read Lesequelle: Zwei Optionen zur Auswahl

  • Direkte Bindung an ein privates Feld (schnellste Variante ohne zusätzlichen Funktionsaufwand)
  • Parameterlose Getter-Funktion mit passendem Rückgabetyp zur Eigenschaft

write Schreibquelle (optional, weggelassen bedeutet schreibgeschützt): Zwei Optionen zur Auswahl

  • Direkte Bindung an ein privates Feld
  • Setter-Funktion mit genau einem Parameter, dessen Typ zur Eigenschaft passt

Zusätzliche Modifikatoren nur für Serialisierung: default, stored

Der Compiler erzwingt eine strenge Typübereinstimmungsprüfung:

  • Integer-Eigenschaft: Getter muss ohne Parameter Integer zurückgeben / read bindet Integer-privates Feld
  • String-Eigenschaft: Setter muss einen const string-Parameter akzeptieren

Published-Eigenschaften und Serialisierung

1. Was ist Serialisierung

Vollständige Objektdaten in einen Stream (Datei/Speicher/JSON) schreiben, um das Objekt später aus dem Stream wiederherzustellen ;

Lazarus Formular-Dateien .lfm und Delphi .dfm basieren vollständig auf diesem Mechanismus im Hintergrund.

  • Grundvoraussetzung: Eigenschaften müssen im published-Bereich stehen, damit RTTI Laufzeittypinformationen sie erkennen
  • Zugehörige Hilfsunits:
  • LResources: Lesen und Schreiben von lfm-Formulardateien
  • FpJsonRtti / CastleComponentSerialize: JSON-Serialisierung von Objekten

2. Serialisierungsspezifische Modifikatoren

default <Konstante>: Markiert den Standardwert der Eigenschaft

  • Nur zur Auswertung durch Serialisierungswerkzeuge: Stimmt der Eigenschaftswert nach Objekterstellung mit default überein, wird er bei der Serialisierung weggelassen, um die Dateigröße zu verringern
  • Keine automatische Initialisierung: Im Konstruktor muss dem Feld manuell der default-Wert zugewiesen werden

stored <Bool/Methode>: Steuert, ob die Eigenschaft bei der Serialisierung gespeichert wird

  • stored True: Standardwert, die Eigenschaft wird bei Serialisierung in die Datei geschrieben
  • stored False: Diese Eigenschaft wird niemals gespeichert
  • stored IsNeedSave: Ruft eine boolesche Methode auf, um dynamisch über die Speicherung zu entscheiden

Beispiel zur Serialisierung

type
  TWebPage = class
  private
    FColor: TColor;
    function SetColor(const Value: TColor): TColor;
  published
    // default clBlack bedeutet Standardfarbe Schwarz; Konstruktor muss manuell FColor := clBlack setzen
    property Color: TColor read FColor write SetColor default clBlack;
    // stored False speichert nicht in lfm/json
    property TempCache: string read FTemp write FTemp stored False;
  end;

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert