因为TComponent已经实现了接口IInterface,所以它的子类,继承接口之后不需要再重新实现引用计数之类的方法。而直接继承自TObject的类则没有,所以要实现接口,必须实现IInterface接口中的引用计数等方法,或者可以直接继承system单元中的TInterfacedObject(已经将这些方法实现)。
但是要注意,XX类如果直接继承自TInterfacedObject类,那么表示XX类的生命周期已经委托给了接口,所以当接口的引用计数为0时,XX类就会跟着释放,不必再重复释放,不让会报错。请看下面代码:
function TInterfacedObject._Release: Integer;
begin
Result := InterlockedDecrement(FRefCount);
if Result = 0 then
Destroy;
end;
当引用计数为0时,会执行destroy方法将内存释放。
而TComponent在实现_Release方法时,没有将自己的生命周期托管给接口,所以就算接口引用计数为0,继承自TComponent的类也必须自己释放。看下面代码:
funct