Einzelnen Beitrag anzeigen

Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#9

AW: Verständnisfrage: Interface und dazugehöriges Objekt

  Alt 23. Aug 2012, 18:39
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.
$2B or not $2B

Geändert von himitsu (23. Aug 2012 um 18:43 Uhr)
  Mit Zitat antworten Zitat