gpt4 book ai didi

delphi - 如何将 TComparer 类传递给 Delphi 中的泛型类型?

转载 作者:行者123 更新时间:2023-12-03 15:05:06 28 4
gpt4 key购买 nike

我想创建一个具有某些功能的通用记录,包括搜索功能。为了执行此搜索,我想传递一个自定义比较器来比较项目。如果它是一个类,我可以在构造函数中传递它,但我想使用记录来避免创建或释放它。因此,我没有用于初始化比较器的构造函数。

然后我决定像 Type 参数一样传递 Comparer 类,当我需要比较器时,使用 TComparer.Default 创建比较器的实例。

嗯,这是代码:

TMyArray<T,C: TComparer<T>> = record
FComparer: IComparer<T>;
Items: TArray<T>;

function Contains<AItem: T>: Boolean;
end;

当我尝试以这种方式使用它时出现问题:

TMyRecord = record
Score: Real;
A: string;
B: string;
end;

TMyRecordComparer = class(TComparer<TMyRecord>)
function Compare(Left, Right: TMyRecord): Integer;
end;

TMyRecordArray = TMyArray<TMyRecord, TMyRecordComparer>;

通过最后一个声明,我收到此错误:E2515 类型参数“T”与类型“System.Generics.Defaults.TComparer\”不兼容。

知道如何解决这个问题吗?

最佳答案

虽然 David 的答案解决了编译错误的问题,但我实际上会使用不同的约束:

TMyArray<T; C: class, constructor, IComparer<T>> = record

这意味着C必须是具有无参数构造函数的类并实现 IComparer<T>界面。这稍微放松了约束,因为您不必从 System.Generics.Collections.TComparer<T> 继承比较器。但只实现所需的IComparer<T>界面。

另外,fwiw,使用问题中发布的代码,您将收到 W1010 警告,这意味着您缺少 TMyRecordComparer.Compare 上的覆盖。方法(及其缺失的 const )。如果您继承自TComparer<T>,则需要这样做因为那个人实现了IComparer<T>使用虚拟抽象方法。

您的使用想法.Default也将不起作用,因为为类型 T 创建比较器的默认实现。但您想使用您指定的自定义名称。

因此,根据我上面写的约束,您可以执行类似的操作(简单的非线程安全实现):

function TMyArray<T, C>.Contains<AItem>: Boolean;
begin
if FComparer = nil then
FComparer := C.Create;
// ....
end;

最后但并非最不重要的一点是,我不确定你的 Contains方法是正确的 - 您编写它的方式表明您想要检查数组是否包含 AItem 类型的元素其类型为T或子类型(或者如果 T 是接口(interface)类型,则实现 T ) - 我猜你想写

function Contains(AItem: T): Boolean;

关于delphi - 如何将 TComparer<T> 类传递给 Delphi 中的泛型类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56355931/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com