【问题标题】:Interfaces and Generics接口和泛型
【发布时间】:2009-07-30 09:37:35
【问题描述】:

我无法让泛型在以下情况下工作:

Delphi提供了IComparable接口:

IComparable <T> = interface
  function CompareTo (Value : T) : Integer;
end;

我添加另一个接口IPersistent:

IPersistent = interface
  function  ToString : String;
  procedure FromString (const Str : String);
end;

实现两个接口的类的一个示例:

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;

现在是另一个具有两个接口约束的泛型类:

ISortIndex <VALUE_TYPE : IPersistent, IComparable> = interface
  ...
end;

最后是该接口的一个实现:

TSimpleSortIndex <VALUE_TYPE : IPersistent, IComparable> = class (TInterfacedObject, ISortIndex <VALUE_TYPE>)

  ...
end;

现在,当我尝试声明这样的排序索引时:

FSortIndex : ISortIndex <TComparableString>;

我收到一条错误消息

[DCC Error] Database.pas(172): E2514 Type parameter 'VALUE_TYPE' must support  interface 'IComparable'

我尝试了几件事,但无法正常工作。

有人帮忙吗?谢谢!

【问题讨论】:

    标签: delphi generics interface delphi-2009


    【解决方案1】:

    您的TComparableString 类没有实现非泛型IComparable 接口,因此它不满足类型约束。您必须更改约束或实施IComparable。

    更改约束可能是最简单的方法。我不太了解 Delphi,但看看这是否有效:

    ISortIndex <VALUE_TYPE : IPersistent, IComparable<VALUE_TYPE>> = interface
    
    TSimpleSortIndex <VALUE_TYPE : IPersistent, IComparable<VALUE_TYPE>> = 
        class (TInterfacedObject, ISortIndex <VALUE_TYPE>)
    

    编辑:我没有注意到您的TComparableString 实现了IComparable&lt;String&gt; 而不是IComparable&lt;TComparableString&gt;。这是故意的吗?通常,某些东西可以与自身的其他实例进行比较,而不是不同的类型。

    您可以向 ISortIndex/TSimpleSortIndex 引入 另一个 类型参数,以指示 VALUE_TYPE 应该与之相当的类型 - 但我怀疑它更明智更改TComparableString。

    【讨论】:

    • 我试过了。它会导致以下错误:“E2514 类型参数 'VALUE_TYPE' 必须支持接口 'IComparable'”
    • 我真的打算在那里使用 TComparableString 而不是 String。现在一切似乎都很好。感谢您提供快速准确的帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-23
    相关资源
    最近更新 更多