我想定义一个名为的特征Ext
,它将现有equals
方法重命名为equalsByAttributes
并同时定义一个新equals
方法。该特征用于扩展案例类。我目前的解决方案看起来有点hacky:
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
'sequals
方法的方法,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)
}