Oop 为什么根对象实现相等?

Oop 为什么根对象实现相等?,oop,equality,conceptual,Oop,Equality,Conceptual,在许多面向对象的语言中,如Java、.NET系列、Python、Ruby,我相信还有许多其他语言,所有其他类继承的根对象类定义了一个平等检查方法。然而,根据我的经验,我创建的许多类实际上不需要进行平等性检查,或者我(或同事)不需要重写默认方法,因为我们不打算使用它。在后一种情况下,默认的相等方法不能很好地表示该类的相等。那么,为什么这么多语言在根对象类的定义中提供了这种方法,而许多类似乎不应该这样做呢?为什么不取消相等方法,并在用户需要时强制用户定义它?对于任何对象引用X和Y,无论其类型如何,都

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

对于任何对象引用
X
Y
,无论其类型如何,都可以有意义地询问和回答以下问题:“X引用的对象是否等同于
Y
引用的对象”。如果
X
代表保时捷911汽车,
Y
代表铸铁公园长凳,答案将是“否”。平心而论,如果一个人知道
X
是一辆汽车,而
Y
是一张长凳,那么他可能不会费心去问,但假设
X
Y
,或者两者都是“可能被要求粉刷的东西”。人们可能不知道
X
Y
是否属于同一类型,并且对象不等效,人们可能不在乎。有了一种通用的等价性查询方法,代码就不用担心对象的确切类型了


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

对于任何对象引用
X
Y
,无论它们的类型如何,都可以有意义地问和回答这个问题“X所指的物体是否与Y所指的物体相等。如果X代表保时捷911汽车,
Y
代表铸铁公园长凳,答案将是“否”可以肯定的是,如果一个人知道
X
是一辆汽车,而
Y
是一张长凳,他可能不会费心去问,但假设
X
Y
,或者两者都是“可能被要求粉刷的东西”。人们可能不知道
X
Y
是否属于同一类型,并且对象不等效,人们可能不在乎。有了一种通用的等价性查询方法,代码就不用担心对象的确切类型了


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

如果有人能解释投票结果,我将不胜感激。如果这个问题离题或不允许,我将删除它。如果有人能解释否决票,我将不胜感激。如果这个问题是离题的或者是不允许的,我会删除它。这是一个公平的观点。然而,在我看来,我们可以使用正常的面向对象实践来处理这个问题。在静态类型语言中,可以实现接口。在您的特定示例中,它可能是
Paintable
IPaintable
或您根据语言约定所拥有的东西,并且此接口可能会扩展定义equals方法的接口(
equalable
IEquatable
)。在动态语言中,我认为duck类型约定要求您尝试调用equals,如果它没有定义equals方法,就让它爆炸。我遗漏了什么吗?我认为您遗漏的一件事是,如果不要求所有对象实现等价测试,那么每个接口
IFoo
必须(1)要求所有实现提供等价测试,或者(2)要求想要测试两个
IFoo
引用的等价性的代码必须转换为其他引用。考虑到任何实现
IFoo
的类对象都可以(像任何不实现的对象一样)实现等价测试,选项#1比#2好,但如果几乎每个接口都需要进行等价测试,那么不妨咬紧牙关,使其具有通用性。@jpmc26:见上文。另外,尽管我从性能角度理解了为什么框架允许对任意引用进行引用相等性测试,但我认为从纯OOP的角度来看,唯一允许的测试是查看引用