将类层次结构的祖先从TObject更改为TInterfacedObject是否有任何副作用,以便我可以在继承链的下方实现接口?
我已经在Delphi中编程了好几年但从未遇到过接口。我习惯于在其他语言中使用它们。既然我再次参与了Delphi项目,我想开始利用它们,但我知道它们的工作方式与Java或C#不同。
答案 0 :(得分:4)
如果已经有使用该类的现有代码,则可能需要修改其中的大量代码来保持对接口的引用而不是对象实例。接口被引用计数并自动释放,因此,对实现者实例的任何引用都将成为无效指针。
答案 1 :(得分:3)
只要从层次结构的顶部(底部?)继承下面的类,这将正常工作。此代码确保您的新类不会自行释放 - 这是TInterfaceObject的默认行为 - 您可能已经自己释放它们并希望保留它。这个活动实际上正是VCL中的TComponent所做的 - 它支持接口,但不是引用计数。
type
TYourAncestor = class( TInterfacedObject )
function QueryInterface(const IID: TGUID; out Obj): HResult; stdcall;
function _AddRef: Integer; stdcall;
function _Release: Integer; stdcall;
end;
implementation
function TYourAncestor.QueryInterface(const IID: TGUID; out Obj): HResult;
const
E_NOINTERFACE = HResult($80004002);
begin
if GetInterface(IID, Obj) then Result := 0 else Result := E_NOINTERFACE;
end;
function TYourAncestor._AddRef: Integer;
begin
Result := -1 // -1 indicates no reference counting is taking place
end;
function TYourAncestor._Release: Integer;
begin
Result := -1 // -1 indicates no reference counting is taking place
end;
答案 2 :(得分:1)
除了实例大小中的一些额外字节外,没有。这可能是最好的方法。