Я хочу определить трейт с именем 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
, чтобы можно было избежать повторной реализации этого метода?
Поскольку существует решение для ссылки на суперреализации с помощью super.METHOD_NAME
, я подумал, что должен быть аналогичный синтаксис, такой как overridden.METHOD_NAME
, для доступа к конкретным реализациям в базовом классе/черте, которые будут расширены чертой, так что мой Ext
черта будет выглядеть так:
trait Ext { p: Product =>
override def equals(obj: Any) =...
def equalsByAttributes(obj: Any) = overridden.equals(obj)
}