Ash*_*ary 66 inheritance scala case-class
在寻找别的东西时,我只是偶然发现了一些关于恶魔案例类继承的评论.这个东西被称为ProductN,可怜虫和国王,精灵和巫师,以及如何通过案例类继承丢失某种非常理想的属性.那么case类继承有什么问题呢?
oxb*_*kes 109
一句话:平等
case类提供了equals和提供的实现hashCode.等价关系,称为这样的equals工作(即必须具有以下属性):
x; x equals x是true(反身)x,y,z,if x equals y和y equals zthen x equals z(传递)x,y; 如果x equals y那么y equals x(对称)只要允许继承层次结构中的相等性,就可以中断2和3.这可以通过以下示例进行简单演示:
case class Point(x: Int, y: Int)
case class ColoredPoint(x: Int, y: Int, c: Color) extends Point(x, y)
Run Code Online (Sandbox Code Playgroud)
然后我们有:
Point(0, 0) equals ColoredPoint(0, 0, RED)
Run Code Online (Sandbox Code Playgroud)
但不是
ColoredPoint(0, 0, RED) equals Point(0, 0)
Run Code Online (Sandbox Code Playgroud)
您可能会争辩说所有类层次结构都可能存在这个问题,这是事实.但是案例类专门用于从开发人员的角度(以及其他原因)简化相等性,因此让它们行为非直观地定义为自己的目标!
还有其他原因; 值得注意的是,事实copy并未按预期工作并与模式匹配器进行交互.