gpt4 book ai didi

delphi - Delphi 泛型集合会覆盖 equals 吗?

转载 作者:行者123 更新时间:2023-12-02 10:47:31 25 4
gpt4 key购买 nike

这是通用集合专家的问题。

我很震惊地发现 TList 没有覆盖 equals。看一下这个例子:

list1:=TList<String>.Create;       
list2:=TList<String>.Create;

list1.Add('Test');
list2.Add('Test');

Result:=list1.Equals(list2);

“结果”为假,即使两个列表包含相同的数据。它使用默认的 equals() (它只是比较两个引用的相等性)。

看看代码,看起来所有其他通用集合类型也是如此。

这是对的吗,还是我遗漏了什么?

如果尝试在实践中使用 TList,这似乎是一个大问题。我该如何解决这个问题?我是否创建自己的 TBetterList 来扩展 TList 并覆盖 equals 来做一些有用的事情?或者我会遇到 Delphi 泛型的进一步复杂情况......?

[编辑:到目前为止,我有一个答案,得到了很多赞成票,但它并没有真正告诉我我想知道什么。我会尝试重新表述这个问题]

在Java中,我可以这样做:

List<Person> list1=new ArrayList<Person>();
List<Person> list2=new ArrayList<Person>();
list1.add(person1);
list2.add(person1);
boolean result=list1.equals(list2);

结果将为true。我不需要子类化任何东西,它就可以工作。

我怎样才能在Delphi中做同样的事情?

如果我在 Delphi 中编写相同的代码,结果最终将错误。

如果有一个解决方案仅适用于 TObject,但不适用于字符串或整数,那么这也将非常有用。

最佳答案

泛型与这个问题的关键没有直接关系:选择什么构成 Equals() 测试的有效基本实现是完全任意的。 TList.Equals() 的当前实现至少与(我认为)VCL 中的所有其他类似基类保持一致,并且我所说的“类似”不仅仅指集合或泛型类。

例如,TPercient.Equals() 还执行简单的引用比较 - 它不比较任何已发布属性的值,这可以说是您所拥有的相等测试类型的语义等价物记住TList

您谈论扩展TBetterList并在派生类中做一些有用的事情,就好像这是对您的一项繁重的义务,但这正是面向对象软件开发的本质。

核心框架中的基类提供了通用实用程序定义的东西。您认为有效的 Equals() 实现可能与其他人的需求存在显着差异(或者实际上在您自己的项目中,从从该基类派生的一个类到另一个类)。

所以,是的,然后由您来实现对所提供的基类的扩展,该扩展反过来将提供一个对您特别有用的基类。

但这不是问题。

这是一个机会。

:)

但是,您肯定会遇到有关泛型的更多问题,而不仅仅是在 Delphi 中。 ;)

关于delphi - Delphi 泛型集合会覆盖 equals 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3368225/

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