Ich möchte ein Merkmal mit dem Namen Ext
definieren, das die vorhandene Methode equals
in equalsByAttributes
umbenennt und gleichzeitig eine neue equals
Methode definiert. Das Merkmal wird verwendet, um Fallklassen zu erweitern. Meine aktuelle Lösung sieht irgendwie heimtückisch aus:
case class A(id: Int) extends Ext
trait Ext { p: Product =>
// neue Implementierung
override def equals(obj: Any) = obj match {
case that: AnyRef => this eq that
case _ => false
}
// Neuimplementierung der alten equals-Implementierung
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
}
}
Ich frage mich, ob es eine direkte Möglichkeit gibt, auf die equals
-Methode von A
in equalsByAttributes
zu verweisen, um die Neuimplementierung dieser Methode zu vermeiden?
Bearbeiten 2012-07-12
Da es eine Lösung für das Referenzieren von Superimplementierungen mit super.METHOD_NAME
gibt, dachte ich, es müsse eine ähnliche Syntax wie overridden.METHOD_NAME
geben, um spezifische Implementierungen in der Basisklasse/dem Basistrait abzurufen, die vom Trait erweitert werden soll. Meine Ext
-Trait würde dann so aussehen:
trait Ext { p: Product =>
override def equals(obj: Any) = ...
def equalsByAttributes(obj: Any) = overridden.equals(obj)
}