gpt4 book ai didi

scala - 案例类继承有什么*如此*错误?

转载 作者:行者123 更新时间:2023-12-05 07:55:01 25 4
gpt4 key购买 nike

在寻找其他东西时,完全出于巧合,我偶然发现了一些关于案例类继承是多么邪恶的评论。有一个叫做 ProductN 的东西,坏蛋和国王, Sprite 和巫师,以及一些非常理想的属性是如何随着案例类继承而丢失的。那么案例类继承有什么问题呢?

最佳答案

一个字:平等

case 类附带提供的 equalshashCode 实现。称为 equals 的等价关系是这样工作的(即必须具有以下属性):

  1. 对于所有xx 等于 xtrue(自反)
  2. 对于xyz;如果 x 等于 y 并且 y 等于 z 那么 x 等于 z(传递)
  3. 对于xy;如果 x 等于 y 那么 y 等于 x(对称)

只要您允许继承层次结构中的相等性,您就可以打破 2 和 3。以下示例简单地证明了这一点:

case class Point(x: Int, y: Int)
case class ColoredPoint(x: Int, y: Int, c: Color) extends Point(x, y)

然后我们有:

Point(0, 0) equals ColoredPoint(0, 0, RED)

不是

ColoredPoint(0, 0, RED) equals Point(0, 0)

您可能会争辩说所有的类层次结构都可能存在这个问题,这是事实。但是案例类的存在专门用于从开发人员的角度简化相等性(以及其他原因),因此让它们表现非直观将是一个自己的目标的定义!


还有其他原因;值得注意的是 copy did not work as expectedinteraction with the pattern matcher .

关于scala - 案例类继承有什么*如此*错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30454354/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com