delphi – 是否有任何泛型类型实现QueryInterface?

前端之家收集整理的这篇文章主要介绍了delphi – 是否有任何泛型类型实现QueryInterface?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
请考虑以下代码
TMyList = class(TList<IMyItem>,IMyList)

Delphi向我显示错误

[DCC Error] test.pas(104): E2003 Undeclared identifier: 'QueryInterface'

是否有实现IInterface的通用列表?

解决方法

Generics.Collections中的类不实现IInterface.您必须在派生类中自己介绍它并提供标准实现.或者找到一个不同的第三方容器类集合.

例如:

TInterfacedList<T> = class(TList<T>,IInterface)
protected
  FRefCount: Integer;
  function QueryInterface(const IID: TGUID; out Obj): HResult; stdcall;
  function _AddRef: Integer; stdcall;
  function _Release: Integer; stdcall;
end;

function TInterfacedList<T>.QueryInterface(const IID: TGUID; out Obj): HResult;
begin
  if GetInterface(IID,Obj) then
    Result := 0
  else
    Result := E_NOINTERFACE;
end;

function TInterfacedList<T>._AddRef: Integer;
begin
  Result := InterlockedIncrement(FRefCount);
end;

function TInterfacedList<T>._Release: Integer;
begin
  Result := InterlockedDecrement(FRefCount);
  if Result = 0 then
    Destroy;
end;

然后,您可以声明您的专业类:

TMyList = class(TInterfacedList<IMyItem>,IMyList)

请记住,您需要像使用引用计数生命周期管理的任何其他类一样对待此类.只能通过接口引用它.

你真的想在TInterfacedList< T>之前做更多的工作.很有用.您需要声明IList< T>这会暴露列表功能.它会是这样的:

IList<T> = interface
  function Add(const Value: T): Integer;
  procedure Insert(Index: Integer; const Value: T);
  .... etc. etc.
end;

然后,您可以简单地添加IList< T>到TInterfacedList< T>支持的接口列表和基类TList< T>将履行接口合同.

TInterfacedList<T> = class(TList<T>,IInterface,IList<T>)

猜你在找的Delphi相关文章