【发布时间】:2017-04-28 12:01:08
【问题描述】:
我有一个可以保存接口的列表。
我想要一个删除功能,它只删除支持特定接口的项目。
type
TMyList<T: IFoo> = class
procedure Remove(const Item: T); overload;
procedure Remove<I: IBar>(const Item: T); overload;
end;
procedure TMyList<T>.Remove<I>(const Item: T);
begin
if Supports(Item, I) then Remove(Item);
end;
E2250 没有可以使用这些参数调用的“支持”的重载版本
有没有办法做到这一点?
【问题讨论】:
-
您是否为界面生成了 GUID?编译器通过其 GUID 识别接口。
-
您声明要删除实现特定接口的项目。如果是这样,那么列表应该包含对象,而不是接口。 Supports 方法旨在像这样使用:Supports(myObject, IMyInterface, Intf),其中 Intf 是 IMyInterface 类型的变量,如果 myObject 实现它,则将其分配给 Intf。 (这是特定重载版本 Supports 的示例,我认为您应该使用该版本)
-
@David Heffernan,是的,您可以将通用参数约束为接口。问题是,它只适用于通用扩展。类型信息不会进入编译阶段。也就是说,即使“I”被限制为 IBar,编译器在调用“Supports”时并不知道它应该是一个接口
-
@DaveOlson 谢谢