>>如果使用接口,就应该完全让其为你管理对象的生命周期,
而不应该参杂手工管理在其中,否则把自己搞糊涂是在所难免的。
这句话我不敢苟同,考虑这么一种情况:
由于类A的功能比较特殊,初始化耗时较长,所以我把类A设计成一个无状态的单例模式。
如果我把生命周期完全交给引用计数的话,就会引起类A频繁的释放和创建,因为有多个类会根据
运行状态来决定是否使用类A。而这是不允许的。
其实从D6开始,Delphi就已经考虑了这一情况,并试图把接口从纯粹的为COM服务变成OP语言的一部分
举两个例子:
D6
TComponent = class(TPersistent, IInterface, IInterfaceComponentReference)
D5
TComponent = class(TPersistent)
在D6中,如果你的类是从TComponent及其继承类继承并要实现某一接口可以不实现那三个该死的函数,
因为TComponent已经有了缺省实现。当然在D5中也可以从TInterfacedObject等有限的几个类
继承,不过范围太小。
d6
IInterface = interface
['{00000000-0000-0000-C000-000000000046}']
function QueryInterface(const IID: TGUID
out Obj): HResult
stdcall;
function _AddRef: Integer
stdcall;
function _Release: Integer
stdcall;
end;
IUnknown = IInterface;
TInterfacedObject = class(TObject, IInterface)
d5
IUnknown = interface
['{00000000-0000-0000-C000-000000000046}']
function QueryInterface(const IID: TGUID
out Obj): HResult
stdcall;
function _AddRef: Integer
stdcall;
function _Release: Integer
stdcall;
end;
TInterfacedObject = class(TObject, IUnknown)
D6中所有的接口是从IInterface继承而不是IUnknown,而且一些跟COM无关的类也是从IInterface继承。
虽然目前本质上是一样的,不过难保将来不发生变化。
以上两点,变化虽然不大,不过却显示出Borland希望Delphi能够更好的为面向接口编程服务。