Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Interface übergeben


Nico80 - Do 07.09.06 15:45
Titel: Interface übergeben
ich habe eine Frage zum Thema Interface...

ich habe folgende Methode (die bis jetzt nichts macht):


Delphi-Quelltext
1:
2:
3:
procedure TSubject.RegisterObserver(Observer: IObserver);
begin
end;


so rufe ich diese Methode auf:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
  TObserver =class(TInterfacedObject, IObserver)
  ...
  end;

  procedure TObserver.machwas();
  var
  FSubject: TSubject;
  begin
  ... 
  FSubject.RegisterObserver(self);
  ...


Nachdem ich die Methode RegisterObserver(self) aufgerufen habe, kann ich auf das Objekt(also auf das sich self bezieht) nicht mehr zugreifen.

Wenn ich dagegen die Methode so implmentier funktionierts:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
  procedure TObserver.machwas();
  var
  FSubject: TSubject;
  o: IObserver;
  begin
  ... 
  o := self;
  FSubject.RegisterObserver(o);
  ...


IObserver ist ein Interface.

Was ändert sich durch die Zuweisung?
Bitte um Hilfe, Danke!!!!!!


iKilledKenny - Do 07.09.06 16:11

der reference count wird eins runtergezählt, danach gibts keine reference mehr auf das interface und damit räumt sich dein objekt weg.

überschreibe in deinem TObserver mal den destructor und setze dort einen breakpoint, dann siehst dus.

grüße
alex


Nico80 - Do 07.09.06 16:43

ok habe ich gesehen. und wie kann ich das verhindern? oder was mache ich falsch???


Nico80 - Do 07.09.06 16:53

ok mit _addRef

hab die Antwort selbst gefunden!!!


rochus - Do 07.09.06 18:33

du kannst alternativ dazu (und bevorzugt!) den Parameter als konstanten Wert übergeben:


Delphi-Quelltext
1:
2:
3:
4:
procedure TSubject.RegisterObserver(const Observer: IObserver);
begin
  // ...
end;


Damit sparst du dir die _AddRef-Aufrufe, die sind nämlich fehleranfällig, sprich, man vergisst sie sehr gerne!