gpt4 book ai didi

scala - 重命名并覆盖案例类中的 equals 方法

转载 作者:行者123 更新时间:2023-12-02 13:49:03 26 4
gpt4 key购买 nike

我想定义一个名为 Ext 的特征重命名现有的 equals方法equalsByAttributes并定义了一个新的 equals同时方法。该特质被使用扩展案例类。我当前的解决方案看起来有点老套:

case class A(id: Int) extends Ext

trait Ext { p: Product =>
// new implementation
override def equals(obj: Any) = obj match {
case that: AnyRef => this eq that
case _ => false
}

// reimplementation of old equals implementation
def equalsByAttributes(obj: Any) = obj match {
case that: Product =>
if (this.getClass.isAssignableFrom(that.getClass) || that.getClass.isAssignableFrom(this.getClass))
p.productIterator.toList == that.productIterator.toList
else
false
case _ => false
}
}

不知道有没有直接引用A的方法的equals equalsByAttributes中的方法这样就可以避免重新实现该方法?

编辑2012-07-12

因为有一个使用 super.METHOD_NAME 引用 super 实现的解决方案我认为一定有类似的语法,例如 overridden.METHOD_NAME用于访问将由特征扩展的基类/特征中的特定实现,以便我的 Ext特征看起来像这样:

trait Ext { p: Product =>
override def equals(obj: Any) = ...

def equalsByAttributes(obj: Any) = overridden.equals(obj)
}

最佳答案

不要更改案例类的等于。如果您需要这样做,请不要将您的类(class)设为案例类。更改案例类方法将使代码表现出意外(即与案例类不同),这将增加维护成本,破坏假设案例类像案例类一样工作的一切,让人们的生活变得悲惨,让很多程序员讨厌你.

换句话来说,这不值得。不要这样做。

关于scala - 重命名并覆盖案例类中的 equals 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11395127/

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