使用Delphi 7.这是一个(不完整的)示例,演示了我的问题:
interface
uses Classes, Contnrs;
type
IEditorModule = interface;
procedure Method1;
procedure Method2;
end;
TEditorModuleList = class(TList)
protected
function GetItem(Index: Integer): IEditorModule;
procedure SetItem(Index: Integer; const Value: IEditorModule);
public
property Items[Index: Integer]: IEditorModule
read GetItem write SetItem; default;
end;
implementation
function TEditorModuleList.GetItem(Index: Integer): IEditorModule;
begin
Result := IEditorModule(inherited Items[index]);
end;
无法编译,因为我收到此错误:
[错误] LEditorModule.pas(73):不兼容的类型:'IEditorModule'和'TObject'
声明新TList后代的主要原因是能够执行以下操作:
aModuleList[3].Method1;
什么样的语法允许我将对象强制转换为接口(而不是具体的类)?事实:
我该怎么做?
答案 0 :(得分:6)
最简单的方法是使用TInterfaceList作为接口。它在Delphi 7中可用.TInterfaceList中内置了一些逻辑来管理引用计数,例如在清除列表时将它们设置为nil。
如果你看一下TInterfaceList背后的代码,你会看到一些发生的动作。
你应该小心一点的是,TInterfaceList在内部使用TThreadList,因此在锁定和解锁列表时会有一些开销。