Я ожидаю, что подсчет ссылок должен работать над внешним агрегирующим объектом в реализации интерфейса. Если я могу ссылаться на другой пример: Ясность в классах, реализующих несколько интерфейсов (альтернатива делегированию):
Ниже приведено минимальное воспроизведение поведения:
program SO16210993;
{$APPTYPE CONSOLE}
type
IFoo = interface
procedure Foo;
end;
TFooImpl = class(TInterfacedObject, IFoo)
procedure Foo;
end;
TContainer = class(TInterfacedObject, IFoo)
private
FFoo: IFoo;
public
constructor Create;
destructor Destroy; override;
property Foo: IFoo read FFoo implements IFoo;
end;
procedure TFooImpl.Foo;
begin
Writeln('TFooImpl.Foo called');
end;
constructor TContainer.Create;
begin
inherited;
FFoo := TFooImpl.Create;
end;
destructor TContainer.Destroy;
begin
Writeln('TContainer.Destroy called');//this line never runs
inherited;
end;
procedure Main;
var
Foo : IFoo;
begin
Foo := TContainer.Create;
Foo.Foo;
end;
begin
Main;
Readln;
end.
Если вместо implements
я реализую интерфейс в классе TImplementor
, тогда выполняется деструктор.