接口直接返回对象实例有什么危害没有(100)

  • 主题发起人 主题发起人 huangsong
  • 开始时间 开始时间
H

huangsong

Unregistered / Unconfirmed
GUEST, unregistred user!
类似这段代码: //基类接口 IBase = interface ['{02C2FD5A-262F-4BB6-9B4F-23E1E49ACB4E}'] function GetObj: TObject;
end;
然后在类实例中如下: function GetObj: TObject;
begin
Result := Self;
end;
请问会对设计架构等各个方面造成什么危害?
 
一般不建议这么做,但危害也谈不上。如果你确实有这方面的需要,那就放心去做吧。
 
基于接口的编程是为了扩展,也方便多语言合作。个人不推荐在接口中采用D特有的对象。
 
这样也许你的接口只有同版本的编译器编译出的程序才能用。
 
对象和接口混用可能会带来生命周期管理上的混乱比如当Delphi编译器计算全部接口引用计数=0时,会自动释放所在的对象,之前通过GetObj得到的对象就是个无效对象引用了,如果继续调用会有什么问题相信很清楚了另外,也可以通过重写IInteface的_Release方法让接口引用计数不影响对象生命周期(TComponent就是这么干的,把COM和VCL分开处理),这种情况下不存在上述问题,但是需要增加一种机制对GetObj返回的对象进行生命周期管理,确保不出现内存泄漏。总而言之,混用对象和接口机制确实会带来混乱和新的麻烦--我就这么干过,我用的方法是对象从TComponent开始继承(这时引用计数不起作用了[因为我没用COM]),然后使用TComponent的容器机制自动管理。。。。
 
接受答案了.
 
后退
顶部