Wenn etwas im Constructor schief geht, dann maximal eine
Exception.
Also entweder wird der Constructor ausgeführt (keine
Exception) und die Variable wird zugewiesen,
oder es knallt mit einer
Exception raus, der variable wird nix zugewiesen, aber auch der nachfolgende Code wird nicht mehr ausgeführt.
Wenn das Programm zum IF kommt, sollte es immer etwas drinsteht, also niemals nil.
(es sei denn jemand überschreibt TObject.NewInstance und gibt dort bösartiger Weise NIL zurück, aber das ist soein Fall, den braucht man nicht beachten, denn wer sowas tut, der soll sich nicht wundern, wenn es dann wo anders knallt)
Delphi-Quellcode:
type
TMyObject =
class
constructor Create;
end;
constructor TMyObject.Create;
begin
Abort;
// raise Exception.Create('peng');
end;
var
O: TObject;
begin
O := TMyObject.Create;
if Assigned(O)
then
ShowMessage('
OK')
else
ShowMessage('
nil');
// das sieht man niemals
Zitat:
Dafür wird im betreffenden Projekt gerne das gemacht.
Wobei ich dabei auch immer irgendwie Bauchschmerzen habe.
Das mit dem GetObject ist in aktuelleren Delphis schon enthalten.
Nur sieht man dort dieses "Interface" nicht direkt, da es kein echtes Interface ist, sondern eine statische
GUID, welche im AS-Operator wie ein virtuelles Interface behandelt wird.
Delphi-Quellcode:
var
i: IMyInterface;
o: TMyObject;
o := i as TMyObject;
Delphi-Quellcode:
type
IMyInterface = interface
['{C6936E1B-F0FE-42A0-A00E-39E90A66A9F0}']
procedure Test;
end;
TMyObject = class(TInterfacedObject, IMyInterface)
FText: string;
constructor Create;
procedure Test;
end;
procedure TMyObject.Test;
begin
ShowMessage(FText);
end;
constructor TMyObject.Create;
begin
inherited;
FText := 'Hallo Welt.';
end;
procedure TForm10.Button3Click(Sender: TObject);
var
I: IMyInterface;
O: TMyObject;
begin
I := TMyObject.Create;
O := I as TMyObject;
O.Test;
I := nil; // letzte und einzige Interfacereferenz vernichten
O.Test;
end;
Aber wie gesagt, man muß wärend man auf dieses Objekt zugreift unbedingt verhindern, daß der Referenzzähler auf 0 geht, jedenfalls bei Interfaces welche sich über die Referenzzählung verwaltet werden.
Bei Onterfaces wo die Freigabe anders gesteuert wird, muß mn eben aufpassen, daß dieses ebenfalls nicht freigegeben wird.
PS: TComponent enthalten Interfaces, welche sich nicht selber freigeben.
Die Freigabe geschieht dort ausschließtlich über das Objekt (Free) und dem Free ist es egal, ob es irgendwo noch Referenzen auf dieses Interfaces/Objekt gibt.