【发布时间】:2012-07-10 15:40:10
【问题描述】:
我想定义一个名为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
}
}
不知道有没有直接在equalsByAttributes中引用A的equals方法,这样就可以避免这个方法的重新实现?
编辑 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)
}
【问题讨论】:
标签: scala case-class