在许多面向对象的语言中,比如Java、.NET家族、PythonRuby语言和其他语言,所有其他类继承的根对象类都定义了一个相等检查方法。然而,根据我的经验,我创建的许多类实际上不需要相等检查,或者我(或同事)不会费心覆盖默认方法,因为我们不打算使用它。在后一种情况下,默认的相等方法并不能很好地表示该类的相等性。那么,为什么这么多语言提供此方法作为根对象类定义的一部分,而许多类似乎不应该提供此方法呢?为什么不放弃equality方法,并在用户需要的时候强制用户定义它呢?
发布于 2013-01-19 04:32:24
对于任何引用X和Y的对象,不管它们的类型如何,都可以有意义地询问和回答“X引用的对象是否等同于Y引用的对象”这个问题。如果X代表一辆Porche911汽车,而Y代表一条普通的公园长椅,那么答案很简单:“不”。可以肯定的是,如果一个人知道X是一辆汽车,Y是一条长椅,人们可能不会费心去问,但假设X、Y或两者都是“可能会被要求画的东西”。人们可能不知道X和Y是否是同一类型的,并且对象不是等价的,人们可能并不关心。有了一种通用的要求等价性的方法,代码就不必担心对象的确切类型了。
让所有对象都将Equals实现为虚方法的原因是,这是一种最简单的机制,通过该机制,对象可以提供比引用相等更广泛的等价定义。通常有用的是,使不可变对象将其自身报告为与具有相同不可变状态的其他对象等效,例如,具有两个字符串,每个字符串都包含六个字符"GEORGE",彼此报告为等效,使所有对象实现Equals作为虚拟方法,并且使可变对象的实现简单地报告引用相等,通常比具有只能在不可变对象上使用的Equals函数更容易。毕竟,对于可变对象来说,简单地将其自身报告为不等于自身以外的任何东西并不难。
https://stackoverflow.com/questions/14388569
复制相似问题