Programmierkurs: Delphi: Pascal: Zugriff auf Klassen

Aus Wikibooks
Zur Navigation springen Zur Suche springen

Zugriff auf Klassen[Bearbeiten]

Hauptsächlich arbeitet man mit Instanzen von Klassen, also Variablen, die über einen Konstruktor erstellt wurden. Die regulären Felder, Methoden und Eigenschaften lassen sich erst aus dieser Instanz heraus verwenden.

Es kann jedoch auch vorkommen, dass man nicht mit einer Instanz, sondern mit der Klasse selbst arbeiten möchte, zum Beispiel um grundlegende Daten über eine Klasse zu erhalten. Hierfür gibt es so genannte Klassenvariablen, Klassenmethoden und Klasseneigenschaften. Diese werden ähnlich wie der Konstruktor über die Typbezeichnung einer Klasse aufgerufen, statt über eine Variable. Vor einem Klassenmember steht immer das Schlüsselwort class:

type
  TKlasse = class
  private
    class var FVariable: Byte;
  public
    class procedure SchreibeVariable;
    class property Variable: Byte read FVariable write FVariable;
  end;

class procedure TKlasse.SchreibeVariable;
begin
  Writeln(Variable);
end;

begin
  TKlasse.Variable := 15;
  TKlasse.SchreibeVariable;
end.

Dieses Beispiel ist bereits so lauffähig, es wird keine Variable benötigt, über die eine Instanz angelegt werden muss.

Klassenmethoden können nur auf Klassenvariablen und -eigenschaften zugreifen, auf normale (instantiierte) nicht. Andersherum können jedoch Instanzmethoden Klassenelemente lesen, ändern bzw. aufrufen. Von einem solchen Konstrukt sollte man jedoch Abstand nehmen, da jede Instanz die Klassenvariable beliebig verändern kann. Dies kann zu unvorhergesehenem Verhalten führen. Folgendes ist also möglich:

type
  TVorfahr = class
  public
    class var Text: string;
    procedure NeuenWertSetzen;
  end;

  TNachfahr = class(TVorfahr)
  public
    procedure NeuenWertSetzen;    // überschreibt die geerbte Methode
  end;

procedure TVorfahr.NeuenWertSetzen;
begin
  Text := 'Vorfahr';
end;

procedure TNachfahr.NeuenWertSetzen;
begin
  Text := 'Nachfahr';
end;

var
  Vorfahr: TVorfahr;
  Nachfahr: TNachfahr;

begin
  Vorfahr := TVorfahr.Create;     // neue Instanz vom Vorfahr, Text = ''
  Nachfahr := TNachfahr.Create;   // neue Instanz vom Nachfahr, Text = ''

  TVorfahr.Text := 'Geht los!';   // TVorfahr.Text = 'Geht los!'
  Vorfahr.NeuenWertSetzen;        // TVorfahr.Text = 'Vorfahr'
  Nachfahr.NeuenWertSetzen;       // TVorfahr.Text = 'Nachfahr'!!!

  Nachfahr.Free;
  Vorfahr.Free;
end.

In diesem Beispiel wird eine Vorfahrklasse angelegt, die eine Klassenvariable „Text“ enthält. Die Methode dieser Klasse füllt die Variable mit „Vorfahr“. Anschließend wird die Klasse an TNachfahr vererbt. Diese enthält ebenfalls die Klassenvariable „Text“, und die überschriebene Methode füllt die Variable mit „Nachfahr“. Die Methode ist eine reguläre Objektmethode, d.h. sie kann nur über eine Instanz der jeweiligen Klasse aufgerufen werden.

Als erstes legen wir also entsprechende Objektinstanzen für beide Klassen an. Dann tragen wir in der Klassenvariablen TVorfahr.Text einen Wert ein, der auch bei einer Ausgabe auf dem Bildschirm so erscheinen würde. Als nächstes lassen wir das Vorfahr-Objekt diesen Text überschreiben. Dabei passiert noch immer nichts unerwartetes, TVorfahr.Text hat nun den entsprechenden Inhalt. Nun aber trägt das Nachfahr-Objekt einen neuen Wert ein und damit besitzt auch TVorfahr.Text diesen neuen Wert.

Auch wenn es nicht so aussieht, es gibt auch eine praktische Anwendung hierfür: Instanzzähler. Unter Umständen möchte oder muss man wissen, wie oft von einer Klasse Objekte erstellt wurden. Dafür kann man einfach eine Klassenvariable als Zähler verwenden und diesen im Konstruktor erhöhen bzw. im Destruktor verringern.


Arrow left.png Pascal: Vererbung Inhaltsverzeichnis Pascal: Interfaces Arrow right.png