class procedure/function und class var sind das was in anderen Sprachen oft als static member bezeichnet wird. Das sind globale variablen und funktionen die einer Klasse zugeordnet sind, ohne eine instanz dieser klasse zu benötigen.
Der Vorteil davon ist zum einen die logische Zuordnung von den membern zu der Klasse, sowie das berücksichtigen von Sichtbarkeitsmodifikatoren (private, protected, public, etc.)
Beispiel singleton pattern:
Code: Alles auswählen
type
{ TTestClass }
TTestClass = class
private
class var _instance: TTestClass;
public
foo: integer;
class function Instance: TTestClass;
constructor Create;
end;
{ TTestClass }
class function TTestClass.Instance: TTestClass;
begin
if TTestClass._instance = nil then
TTestClass._instance := TTestClass.Create;
Result := TTestClass._instance;
end;
constructor TTestClass.Create;
begin
foo := 0;
end;
begin
TTestClass.Instance.foo := 42;
WriteLn(TTestClass.Instance.foo);
end.
Die class variable _instance ist privat, sodass sie nur innerhalb der klasse (z.b. der class methode Instance) verwendet werden kann. Die Klassenmethode Instance greift dann auf diese variable zu, falls diese noch nicht exsistiert, wird sie erstellt und dann zurückgegeben.
Pascal unterstützt keine Privaten Konsturktoren, weshalb die nutzung des Singletons nicht auf compiler ebene enforced werden kann (im gegensatz zu z.B. Java), d.h. es braucht zwar immer noch den guten willen des programmierers, aber im allgemeinen kann man mit so einem singleton pattern garantieren das es nur eine einzige instanz einer klasse gibt die von allen verwendet wird (z.b. hilfreich für datenbank verbindungen die von mehreren Klassen benutzt werden)
Besonders interresant wird das ganze in kombination mit generischen Klassen, da dann jede variable/funktion pro generischer spezialisierung vorliegt, was z.b. zum implementieren von caches verwendet werden kann.