Zum Testen:
Delphi-Quellcode:
type
TFoo = class
private
FData : string;
function GetData : string;
public
property Data : string read GetData;
end;
function TFoo.GetData : string;
begin
if Self = nil then
Result := 'keine Instanz vorhanden'
else
Result := FData;
end;
procedure Test;
var
LFoo : TFoo;
begin
ShowMessage( LFoo.Data );
end;
Das war aber auch ein bisschen Glück! Bei lokalen Variablen innerhalb Prozeduren und Funktionen kann man nicht sicher sein, daß eine Klasseninstanz immer nil ist. Deswegen wird der Aufruf von Test auch bei einigen zu einer Schutzverletzung führen.
Hier mal ein bisschen mehr zum Spielen:
Delphi-Quellcode:
type
TFoo = class
private class var
FCount: Integer;
private
FData : string;
class constructor Create;
function GetData : string;
public
constructor Create;
property Data : string read GetData;
end;
constructor TFoo.Create;
begin
inherited;
Inc(FCount);
FData := 'Instanz: ' + IntToStr(FCount);
end;
class constructor TFoo.Create;
begin
FCount := 0;
end;
function TFoo.GetData : string;
begin
if Self = nil then
Result := 'keine Instanz vorhanden'
else
Result := FData;
end;
procedure Test(init, nilit: Boolean);
var
LFoo : TFoo;
begin
if init then
LFoo := TFoo.Create
else if nilit then
LFoo := nil;
ShowMessage( LFoo.Data );
end;
begin
Test(false, true);
Test(true, false);
Test(false, false);
end.
Der Class-Constructor könnte zur Zeit noch entfallen, da der Compiler auch Klassen-Variablen initialisiert, aber das muss ja nicht immer so bleiben.