【发布时间】:2013-04-19 03:01:12
【问题描述】:
我希望引用计数应该在接口实现中的外部聚合对象上起作用。 如果我可以参考另一个例子:Clarity in classes implementing multiple interfaces (alternative to delegation):
这是行为的最小再现:
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 类中实现接口,然后析构函数运行。
【问题讨论】:
-
“我错过了什么吗?”我不知道。但我们当然是。你忘了包含代码!需要演示行为的完整程序。否则我们必须猜测。
-
你有一些额外的参考或参考循环。为 TFirstSecond._AddRef 和 TFirstSecond._Release 添加覆盖并在此处放置断点,获取完整的引用列表并查看哪些未清除
-
嗯,问题是你的接口是委托的。不知道为什么会导致这种行为。
-
好问题。我冒昧地制作了一个非常简单的演示测试用例。
-
委托的想法是 Delphi 中一个不错的官方功能,但它似乎不起作用?
标签: delphi interface delphi-2007 implements