Felder (Delphi)

Aus RAD Studio
Wechseln zu: Navigation, Suche

Nach oben zu Klassen und Objekte - Index

In diesem Thema wird die Syntax für die Deklaration von Klassendatenfeldern behandelt.

Allgemeines zu Feldern

Ein Feld ist wie eine Variable, die zu einem bestimmten Objekt gehört. Felder können jeden Typ annehmen, auch Klassentypen (können also Objektreferenzen aufnehmen). Sie werden normalerweise als private deklariert.

Um ein Feld als Element einer Klasse zu definieren, deklarieren Sie es einfach wie eine normale Variable. Im folgenden Beispiel wird die Klasse TNumber deklariert. Ihr einziges Element ist das Integer-Feld Int (außerdem erbt sie die Methoden von System.TObject).

 type
   TNumber = class
     var
       Int: Integer;
   end;

Das Schlüsselwort var ist optional. Wenn es nicht angegeben wird, müssen die Felddeklarationen jedoch vor allen Eigenschafts- und Methodendeklarationen stehen. Nach Eigenschafts- oder Methodendeklarationen können mit dem Schlüsselwort var zusätzliche Felddeklarationen eingeführt werden.

Beim Erstellen eines Objekts werden seine Felder mit null oder Standardwerten initialisiert. Dies ist unterschiedlich zu lokalen Variablen, die nicht initialisiert werden. Wenn Sie schreiben:<syntaxhighlight lang="delphi"> var

 N: TNumber;

begin

 N := TNumber.Create;

</syntaxhighlight>Dann ist der Wert von N.Int null.

Felder werden statisch gebunden (die Feldreferenzen werden beim Compilieren aufgelöst). Was dies bedeutet, wird im folgenden Beispiel gezeigt:

 type
    TAncestor = class
       Value: Integer;
    end;
 
    TDescendant = class(TAncestor)
       Value: string;    // hides the inherited Value field
    end;
 
 var
    MyObject: TAncestor;
 
 begin
    MyObject := TDescendant.Create;
    MyObject.Value := 'Hello!'     // error
 
   (MyObject as TDescendant).Value := 'Hello!'   // works!
 end;

Although MyObject holds an instance of TDescendant, it is declared as TAncestor. The compiler therefore interprets MyObject.Value as referring to the (integer) field declared in TAncestor. Both fields, however, exist in the TDescendant object; the inherited Wert is hidden by the new one and can be accessed through a typecast.

Deklarationen von Konstanten und typisierten Konstanten können in Klassen und in nicht anonymen Records mit globalem Gültigkeitsbereich vorkommen. Konstanten und typisierte Konstanten können außerdem in verschachtelten Typdefinitionen vorhanden sein. Konstanten und typisierte Konstanten können nur in Klassendefinitionen vorkommen, wenn die Klasse lokal für eine Prozedur definiert ist (z. B. dürfen sie nicht in Records vorkommen, die innerhalb einer Prozedur definiert sind).

Klassenfelder

Klassenfelder sind Datenfelder in einer Klasse, auf die ohne Objektreferenz zugegriffen werden kann (im Gegensatz zu regulären "Instanzfeldern", die oben besprochen wurden). Die in einem Klassenfeld gespeicherten Daten werden von allen Instanzen der Klasse gemeinsam genutzt. Der Zugriff darauf erfolgt über einen Verweis auf die Klasse oder auf eine Variable, die eine Instanz der Klasse repräsentiert.

Mithilfe einer class var-Deklaration können Sie einen Block von Klassenfeldern innerhalb einer Klassendeklaration einführen. Alle nach class var deklarierten Felder haben statische Speicherattribute. Ein class var-Block wird durch Folgendes abgeschlossen:

  1. Eine weitere class var oder var-Deklaration
  2. Eine Prozedur- oder Funktionsdeklaration (Methodendeklaration) (einschließlich Klassenprozeduren und Klassenfunktionen)
  3. Eine Eigenschaftsdeklaration (einschließlich Klasseneigenschaften)
  4. Eine Konstruktor- oder Destruktor-Deklaration
  5. Ein Sichtbarkeitsattribut (public, private, protected, published, strict private und strict protected)

Zum Beispiel:

 type
     TMyClass = class
       public
         class var        // Introduce a block of class static fields.
           Red: Integer;
           Green: Integer;
           Blue: Integer;
         var              // Ends the class var block.
           InstanceField: Integer;
     end;

Auf die Klassenfelder Red, Green und Blue kann mit dem folgenden Quelltext zugegriffen werden:

 TMyClass.Red := 1;
 TMyClass.Green := 2;
 TMyClass.Blue := 3;

Auf Klassenfelder kann auch über eine Instanz der Klasse zugegriffen werden:

 var
 	myObject: TMyClass;

Dieser Quelltext hat denselben Effekt wie die Zuweisungen an Red, Green und Blue weiter oben:

 myObject.Red := 1;
 myObject.Green := 2;
 myObject.Blue := 3;

Siehe auch

Variablen (Delphi)

Klassen und Objekte (Delphi)

Methoden (Delphi)

Eigenschaften (Delphi)

Verschachtelte Typdeklarationen

Klassenreferenzen

Exceptions (Delphi)

Überladene Operatoren (Delphi)

Unterstützende Klassen und Records (Delphi)