我想定义一个名为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
's equals
中的方法equalsByAttributes
这样就可以避免重新实现这种方法?
编辑2012-07-12
由于有一个解决方案可以引用超级实现super.METHOD_NAME
我认为一定有类似的语法,例如overridden.METHOD_NAME
用于访问将由特征扩展的基类/特征中的特定实现,以便我的Ext
特质看起来像这样:
trait Ext { p: Product =>
override def equals(obj: Any) = ...
def equalsByAttributes(obj: Any) = overridden.equals(obj)
}
不要更改案例类的 equals。如果您需要这样做,请不要将您的课程设为案例类。更改案例类方法将使代码表现出意外(即与案例类不同),这将增加维护成本,破坏假设案例类像案例类一样工作的一切,让人们的生活变得悲惨,让很多程序员讨厌你。
换句话说,这是不值得的。不要那样做。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)