jpf*_*ius 2 delphi generics interface delphi-2009
我有问题要在以下场景中使用泛型:
Delphi提供的IComparable接口:
IComparable <T> = interface
function CompareTo (Value : T) : Integer;
end;
Run Code Online (Sandbox Code Playgroud)
我添加另一个接口IPersistent:
IPersistent = interface
function ToString : String;
procedure FromString (const Str : String);
end;
Run Code Online (Sandbox Code Playgroud)
实现两个接口的类的一个示例:
TComparableString = class (TInterfacedObject, IComparable <String>, IPersistent)
strict private
FValue : String;
public
function CompareTo (Value : String) : Integer;
function ToString : String;
procedure FromString (const Str : String);
end;
Run Code Online (Sandbox Code Playgroud)
现在为另一个具有两个接口约束的泛型类:
ISortIndex <VALUE_TYPE : IPersistent, IComparable> = interface
...
end;
Run Code Online (Sandbox Code Playgroud)
最后是该接口的一个实现:
TSimpleSortIndex <VALUE_TYPE : IPersistent, IComparable> = class (TInterfacedObject, ISortIndex <VALUE_TYPE>)
...
end;
Run Code Online (Sandbox Code Playgroud)
现在当我尝试声明这样的排序索引时:
FSortIndex : ISortIndex <TComparableString>;
Run Code Online (Sandbox Code Playgroud)
我收到一条错误消息
[DCC Error] Database.pas(172): E2514 Type parameter 'VALUE_TYPE' must support interface 'IComparable'
Run Code Online (Sandbox Code Playgroud)
我尝试了几件事,但无法让它发挥作用.
有人帮忙吗?谢谢!
您的TComparableString类没有实现非泛型IComparable接口,因此它不满足类型约束.您必须更改约束或实施IComparable.
改变约束可能是最简单的方法.我真的不懂Delphi,但看看是否有效:
ISortIndex <VALUE_TYPE : IPersistent, IComparable<VALUE_TYPE>> = interface
TSimpleSortIndex <VALUE_TYPE : IPersistent, IComparable<VALUE_TYPE>> =
class (TInterfacedObject, ISortIndex <VALUE_TYPE>)
Run Code Online (Sandbox Code Playgroud)
编辑:我没有注意到你TComparableString实施IComparable<String>而不是IComparable<TComparableString>.这是故意的吗?通常某些东西可以与其他自身实例相媲美,而不是与其他类型相媲美
您可以在/中引入另一个类型参数来指示应该与之类似的类型- 但我怀疑更改是更明智的.ISortIndexTSimpleSortIndexVALUE_TYPETComparableString