在许多面向对象的语言中,例如Java,.NET系列,Python,Ruby,我确信其他许多语言,所有其他类继承的根对象类定义了一个等式检查方法。但是,根据我的经验,我创建的许多类实际上不需要进行等式检查,或者我(或同事)不打扰覆盖默认方法,因为我们不打算使用它。在后一种情况下,默认的相等方法并不能很好地表示该类的相等性。那么为什么这么多语言提供这个方法作为根对象类的定义的一部分,而许多类似乎不应该?为什么不放弃平等方法并强制用户在需要时定义它?
答案 0 :(得分:1)
对于任何引用X
和Y
的对象,无论其类型如何,都可以有意义地询问并回答“X
引用的对象是否等同于由Y
提及。如果X
代表Porche 911汽车而Y
代表铸铁公园长椅,答案就是“不”。可以肯定的是,如果有人知道X
是一辆汽车而Y
是一个替补,那么可能不会打扰,但假设X
,Y
或两者都是,是“可能被要求画的东西”。有人可能不知道X
和Y
是否属于同一类型,而且对象不等同,人们可能并不在意。拥有一种要求等价的通用方法可以节省代码,而不必担心对象的确切类型。
让所有对象实现Equals
作为虚方法的原因在于,它是对象可以提供比引用相等更广泛的等价定义的最简单机制。让不可变对象报告自身等同于具有相同不可变状态的其他对象通常很有用[例如,有两个字符串,两个字符都包含六个字符“GEORGE”,相互报告为等价的]让所有对象实现Equals
作为虚方法,并且让可变对象的实现简单地报告引用相等,通常比拥有Equals
函数,只能用于不可变对象。毕竟,一个可变对象简单地将自己报告为不等于其他任何东西并不难。