覆盖equals方法

时间:2009-09-29 06:35:20

标签: c# oop

用OO的说法,重写equals方法和getHashCode是什么意思?

4 个答案:

答案 0 :(得分:1)

Equals方法比较两个对象(或作为参数传入的对象与调用该方法的对象)。

getHashCode返回一个对每个不同对象都唯一的代码。

这些方法在每个对象中实现。要覆盖这些方法,您需要重新定义这些对象如何定义相等性。

要覆盖一个类,您可以在子类中创建一个具有相同签名的方法(有时还有另一个关键字,例如'override',具体取决于语言)。

您可以使用基本方法,也可以完全定义新方法。 如果调用基本方法,则必须是方法内的第一个语句。

答案 1 :(得分:1)

这两种方法对于管理对象至关重要。 equals()用于比较两个对象(不一定是同一类型,请注意),hashCode()给出一个有希望的对象的唯一数字表示。

在大多数面向对象的语言中,每个类都有这两种方法的默认实现,对于你的类来说不够好。有必要使用有意义的代码覆盖此默认实现,以使方法有用。

这些方法在哪里使用?假设您有一个对象的哈希表。在表中插入新对象需要初始索引搜索的数值。这通常使用hashCode()方法提取,该方法最好提供一个不同的数字(如果哈希表大小是素数,它也有帮助......)。在表中搜索项目需要将包含的项目与给定的样本对象进行比较。这是通过equals()方法实现的,因此重要的是此方法检查特定类的字段是否相等,而不仅仅是内存中的对象地址。

答案 2 :(得分:0)

覆盖equals允许您定义对等类型的相等语义,超出默认值“这些对象实例是否相同?” - 因此您可以定义内容为字符串“cat”的两个不同对象基本相同。散列代码用作相等的快速代理(两个相等的对象必须具有相同的散列码,但反过来显然不成立),以便插入到散列表或类似的数据结构中。

只对基本上不可变的类型才有意义,这样一次完成的比较将保持为真(考虑哈希表用例)。

答案 3 :(得分:0)

我会试着解释一下。 您正在编写的类的基类已经提供了Equals和GetHashCode方法并标记了这些方法,以便您可以根据需要提供自己的实现。

您可以通过编写与基类中的方法具有相同签名的方法来提供您自己的实现,并将它们标记为基类中方法的“覆盖”。

这告诉编译器每当有人调用Equals或GetHashCode时,您希望使用您的实现而不是基类中提供的实现。大多数语言都允许您以某种方式调用基类的实现。这种方式可以构建逻辑以回退到基础实现,或者使用基础实现作为您自己实现的起点。