Felder (Delphi)
Nach oben zu Klassen und Objekte - Index
Dieses Thema befasst sich mit der Syntax für die Deklaration von Klassendatenfeldern.
Allgemeines zu Feldern
Ein Feld ist 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 natürlich die Methoden von TObject).
type TNumber = class var Int: Integer; end;
Das Schlüsselwort var ist optional. Aber wenn es nicht angegeben wird, müssen die Felddeklarationen vor allen Eigenschafts- und Methodendeklarationen stehen. Nach Eigenschafts- oder Methodendeklarationen können mit dem Schlüsselwort var zusätzliche Felddeklarationen eingeführt werden.
Felder werden statisch gebunden (die Feldreferenzen werden also beim Compilieren aufgelöst). Was dies in der Praxis bedeutet, zeigt das folgende Beispiel:
type TAncestor = class Value: Integer; end; TDescendant = class(TAncestor) Value: string; // Verdeckt das geerbte Value-Feld end; var MyObject: TAncestor; begin MyObject := TDescendant.Create; MyObject.Value := 'Hello!' // Fehler (MyObject as TDescendant).Value := 'Hello!' // Funktioniert! end;
MyObject enthält zwar eine Instanz von TDescendant, ist aber als TAncestor deklariert. Der Compiler interpretiert daher MyObject.Value als Verweis auf das in TAncestor deklarierte Integer-Feld. Dennoch sind im TDescendant-Objekt beide Felder vorhanden, nur ist das geerbte Feld Value durch das neue verdeckt. Der Zugriff ist mithilfe einer Typumwandlung weiterhin möglich.
Konstanten- und typisierte Konstanten-Deklarationen können in Klassen und in nicht-anonymen Records mit globalem Gültigkeitsbereich erscheinen. Konstanten und typisierte Konstanten können außerdem in verschachtelten Typen vorkommen. Konstanten und typisierte Konstanten können nur in Klassendefinitionen erscheinen, wenn die Klasse lokal für eine Prozedur definiert ist (z.B. sie dürfen 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 erzeugen. Alle nach class var deklarierten Felder haben statische Speicherattribute. Ein class var-Block wird durch Folgendes abgeschlossen:
- Eine weitere class var oder var-Deklaration
- Eine Prozedur- oder Funktionsdeklaration (Methodendeklaration) (einschließlich Klassenprozeduren und Klassenfunktionen)
- Eine Eigenschaftsdeklaration (einschließlich Klasseneigenschaften)
- Eine Konstruktor- oder Destruktor-Deklaration
- Ein Sichtbarkeitsattribut (public, private, protected, published, strict private undstrict protected)
Beispiel:
type TMyClass = class public class var // Ein neuer Block statischer Klassenfelder. Red: Integer; Green: Integer; Blue: Integer; var // Ende des class var-Blocks. 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. Mit der folgenden Deklaration:
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;