Konstruktoren und Destruktoren
Instanzen einer Klasse entstehen erst dadurch, dass sie ausdrücklich erzeugt werden. Dies geschieht mit dem Konstruktor Create. "Konstruktor" ist ein Fremdwort und bezeichnet jemanden, der etwas konstruiert, also erzeugt. Man könnte create auch eine Methode nennen; es gibt jedoch einen großen Unterschied: Methoden können nur aufgerufen werden, wenn die Instanz bereits existiert. Der Konstruktor dagegen erzeugt die Instanz aus dem Nichts.
Der Konstruktor muss nicht von uns programmiert werden, da alle Klassen, die wir erfinden, automatisch den "Vorfahr" TObject haben und damit alle grundlegenden Dinge von diesem erben. Weitere Informationen über TObject, den "Vater" aller Delphi-Objekte, finden sich in der Delphi-Hilfe. Unter .NET entspricht TObject der Klasse System.Object.
Und so wird eine Instanz erzeugt:
Objektreferenz := Klasse.Create;
In unserem konkreten Fall also:
MeinAuto := TAuto.Create;
Damit wird Speicherplatz für alle Attribute einer Auto-Instanz im Hauptspeicher reserviert und die zugehörige Adresse in der Variablen MeinAuto gespeichert.
Beim Erzeugen einer Klasse werden die jeweils vorhandenen Attribute mit folgenden Startwerten belegt:
- Alle Datenfelder mit einem ganzzahligen Datentyp (z.B. Integer) werden mit 0 initialisiert.
- Alle Datenfelder mit einem String-Typ werden durch eine leere Zeichenkette initialisiert.
- Alle Datenfelder mit einem Zeigertyp werden mit dem Wert nil initialisiert.
- Alle anderen Datenfelder bleiben undefiniert!
Wie auf Attribute und Methoden der neu erzeugten Instanz zugegriffen wird, folgt unter "Zugriff auf Objekte".
create kann übrigens auch an einer Objektreferenz aufgerufen werden. Dadurch wird dann keine neue Instanz erzeugt, sondern es wird das Objekt neu initialisiert.
Instanzen freigeben: Destruktoren
Wird eine Instanz einer Klasse nicht mehr benötigt, sollte der dafür verwendete Hauptspeicher wieder freigegeben werden. Dies geschieht mit dem Gegenstück zum Konstruktor, dem Destruktor ("Zerstörer"). Destroy heißt dieser bei von TObject abgeleiteten Klassen. Um ein Objekt freizugeben, sollte jedoch die Methode Free verwendet werden. Free prüft, ob ein Verweis auf nil vorliegt, anschließend wird Destroy aufgerufen. Die Objektreferenz verweist jetzt allerdings nicht unbedingt auf nil. Soll das der Fall sein, kann auf die Prozedur FreeAndNil (Unit SysUtils) zurückgegriffen werden, die das freizugebende Objekt als Parameter erwartet - es handelt sich hier nicht um eine Methode.
Unter .NET arbeitet im Hintergrund ein Garbage Collector - eine Art Müllsammler, der alle nicht mehr benötigten Speicherbereiche ermittelt und frei gibt. Wann das genau ist, kann man nicht festlegen. Vorteil für den Programmierer: Er kann nicht mehr vergessen, selbst erstellte Objekte wieder freizugeben und damit Speicherlöcher zu produzieren. Stattdessen kümmert sich die .NET-Laufzeitumgebung (CLR) darum.
Dennoch sollte der Aufruf von free erfolgen, um andere Ressourcen freizugeben. Der Garbage Collector kümmert sich nur um den Speicher.
