Es gibt 2 sinnvolle Praktiken.
In die Referenzzählung würde ich nicht eingreifen, denn für denjenigen, der den Code liest, wäre das überraschend.
a) nur mit dem Interface arbeiten
Delphi-Quellcode:
procedure TOtherClass.Test(AFoo: IFoo);
begin
AFoo.DoSomething();
end;
procedure TTestClass.Action();
var
Foo: IFoo; // nicht das Objekt, sondern den Interfacezeiger speichern
LOtherClass: TOtherClass;
begin
Foo := TFoo.Create();
LOtherClass := TOtherClass.Create();
LOtherClass.Test(Foo);
Foo.dosomethingmore(); // dosomethingmore() muss natürlich im Interface deklariert sein
end;
b.) wie a.) nur darf zusätzlich noch auf das Objekt zugegriffen werden
Delphi-Quellcode:
procedure TOtherClass.Test(AFoo: IFoo);
begin
AFoo.DoSomething();
end;
procedure TTestClass.Action();
var
Foo: IFoo; //
FooObj : TFoo; //
LOtherClass: TOtherClass;
begin
FooObj := TFoo.Create();
Foo := FooObj; // Achtung: FooObj darf nicht mit Free freigegeben werden
LOtherClass := TOtherClass.Create();
LOtherClass.Test(Foo);
FooObj.dosomethingmore();
...
FooObj := nil; // Zeile dient nur dazu uns daran zu erinnern, dass FooObj nicht mit Free freigegeben werden darf
end;