Переименовать и переопределить метод equals в классе case

Я хочу определить трейт с именем 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
    }
}

Интересно, есть ли прямой способ сослаться на метод Aequalsв 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)
}
8
задан Stefan Endrullis 10 July 2012 в 07:40
поделиться