接口和泛型

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)

我尝试了几件事,但无法让它发挥作用.

有人帮忙吗?谢谢!

Jon*_*eet 6

您的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