为什么DELPHI的TComponent在非COM对象情况下 不实现引用计数 ( 积分: 300 )

  • 主题发起人 主题发起人 Shepherd
  • 开始时间 开始时间
S

Shepherd

Unregistered / Unconfirmed
GUEST, unregistred user!
var
Intf: IInterface;
Form: TForm;
begin
Form:= TForm2.Create(nil);
Intf:= Form as IInterface;
ShowMessage(IntToStr(Intf._AddRef));
Intf:= nil;
Form.Free;
end;
打出来的结果是 -1
在不修改TComponent的情况下如何解决
 
var
Intf: IInterface;
Form: TForm;
begin
Form:= TForm2.Create(nil);
Intf:= Form as IInterface;
ShowMessage(IntToStr(Intf._AddRef));
Intf:= nil;
Form.Free;
end;
打出来的结果是 -1
在不修改TComponent的情况下如何解决
 
Borland就是这么做的,有什么办法呢,呵呵。
我的思路是,在定义类的时候加入接口
例:
IForm = interface(IInterface)
...
end;

TMyClass = class(TForm, IForm)
end;
这样,TMyClass创建后就有引用计数了。
 
楼上的方法可行
 
如果只是简单的实现一个新的接口 那是不行的 除非修改修改
function _AddRef: Integer; stdcall;
function _Release: Integer; stdcall;
但这两个函数在TComponent中并不是虚函数
 
TComponent实现计数器管理生存期有很多问题。
一个TComponent释放的时候要释放Components中的控件,一个TComponent没有了谁能保证它的Components中的组件就没用了?
一个TTimer没有引用了谁能保证它的事件方法没有用呢
 
确实不好保证 TComponent和其的继承类 一般的使用情况下 都有对象的引用
完全控制好生命周期确实一个问题 要给一种方式可以完全接口管理
这样起码好用一些 现在TComponet只做了在COM对象的时候的计数
 
//但这两个函数在TComponent中并不是虚函数
继承下来可以覆盖,因为是接口的方法
 
后退
顶部