1

在许多面向对象的语言中,例如 Java、.NET 系列、Python、Ruby,我相信还有很多其他语言,所有其他类继承的根对象类定义了相等检查方法。但是,根据我的经验,我创建的许多类确实不需要相等性检查,或者我(或同事)不打算重写默认方法,因为我们不打算使用它。在后一种情况下,默认的相等方法并不能很好地表示该类的相等。那么为什么这么多语言提供这个方法作为根对象类定义的一部分,而很多类似乎不应该呢?为什么不放弃相等方法并强制用户在需要时定义它呢?

4

1 回答 1

1

对于任何对象引用XY,无论它们的类型如何,都可以有意义地询问和回答“对象所引用的对象是否X等同于所引用的对象Y”。如果X代表一辆 Porche 911 汽车并Y代表一个铸铁公园长椅,答案将是“否”。可以肯定的是,如果一个人知道那X是一辆汽车和Y一张长凳,他可能不会费心去问,但假设X,Y或两者都是“可能会被要求画的东西”。人们可能不知道是否XY属于同一类型,对象不等价,可能不在乎。有一种通用的方法来询问等价性,可以让代码不必担心对象的确切类型的麻烦。

将所有对象都实现Equals为虚方法的原因是,它是最简单的机制,通过该机制对象可以提供比引用相等更广泛的等价定义。让不可变对象报告自己与具有相同不可变状态的其他对象等效通常很有用[例如,有两个字符串,都包含六个字符“GEORGE”,彼此报告为等效] 让所有对象实现Equals为虚拟方法,并且让可变对象的实现简单地报告引用相等性,通常比拥有Equals只能用于不可变对象的函数更容易。毕竟,对于一个可变对象来说,简单地报告自己不等于除了它自己之外的任何东西并不难。

于 2013-01-18T20:32:23.940 回答