|
|
Zuerst eingeführt wurde sie mit Delphi, inzwischen ist sie mit Kylix auch für Linux verfügbar. Auch von Drittanbietern wurde diese Sprache eine Zeit lang angeboten, so von Speedsoft, einer deutschen Firma, unter dem Namen Speed Pascal bzw. Sibyl, als auch von der britischen Firma fPrint UK Ltd. unter dem Namen Virtual Pascal. Beide wurden ursprünglich für OS/2 entwickelt und später nach Windows und Linux portiert. Die Entwicklung von Sibyl wurde anscheinend eingestellt, Virtual Pascal ist inzwischen als Freeware erhältlich. Daneben gibt es noch das ebenfalls kostenlose FreePascal, welches unter der GPL steht.
Object Pascal ist nicht die erste objektorientierte Erweiterung von Pascal. Borland hatte bereits bei Version 5.5 von Turbo Pascal ein Objektmodell eingeführt, welches interessanterweise von den Delphi Compilern bis Version 7.0 immer noch unterstützt wird, wenn man auch nach einer Dokumentation vergeblich sucht. (Delphi 8 fuer .NET unterstuetzt sie nicht mehr.)
Object Pascal ist die Grundlage der visuellen Klassenbibliothek Visual Class Library (VCL), auf der Delphi basiert, sowie der neueren Class Library for Cross Platform (CLX), auf der Kylix basiert. Beide Bibliotheken sind stark miteinander verwandt, und es ist häufig einfach, eine für die VCL geschriebene Komponente nach CLX zu portieren.
Ein Unterschied zu z.B. C++ ist, dass es nicht möglich ist Objektinstanzen auf dem Stack anzulegen, d.h. alle Instanzen werden auf dem Heap angelegt. Viele der Elemente und Ideen von ObjectPascal sind in die neue Programmiersprache C# und das Microsoft .NET Framework übernommen worden.
Beispiel einer Klassen-Deklaration:
type
TMyObject = class
private
FSomePrivateField: integer;
protected
procedure SomeProtectedMethod(Param1: integer; const Param2: string; out OutParam: string); virtual;
procedure SetSomeOtherProperty(Value: integer);
function GetSomeOtherProperty: integer;
public
constructor Create;
destructor Destroy; override;
procedure SomePublicMethod;
published
property SomePublishedProperty read FSomePrivateField; // readonly
property SomeOtherProperty: integer read GetSomeOtherProperty write SetSomeOtherProperty;
end;
Properties dienen zum Information hiding, indem ein direkter Zugriff auf die Variable verhindert wird und die Methode entscheiden kann, welchen Wert sie beim Lesen herausgibt und beim Ändern eines Wertes akzeptiert, was einen ADT (abstract data type) auszeichnet. Wird beispielsweise wie bei property SomePublishedProperty keine write-Methode angegeben, so handelt es sich um eine read-only Variable. Die dazugehörige Implemementation:
constructor TMyObject.Create; // legt eine Objectinstanz an begin inherited; // Konstruktor der Oberklasse rufenfSomePrivateField := 42; // privates Feld mit 42 initialisieren end;
destructor TMyObject.Destroy; begin inherited; // Destruktor der Oberklasse aufrufen end;
procedure TMyObject.SomeProtectedMethod(Param1: integer; const Param2: string; out OutParam: string); var i: integer; // Deklaration lokaler Variablenbegin OutParam := ''; // Ausgabeparameter initialisieren
for i:=1 to Param1 do OutParam := OutParam + Param2; // Ausgabeparameter mit dem Eingabeparameter Param1-mal konkatenieren
end;
procedure TMyObject.SomePublicMethod; begin Inc(fSomePrivateField); // privates Feld hochzählen end;
procedure SetSomeOtherProperty(Value: integer); begin fSomePrivateField := Value * 5; end;
function GetSomeOtherProperty: integer; begin Result := fSomePrivateField div 5; end;