Angenommen, ich habe eine Eigenschaft Foo
mit mehreren Methoden. Ich möchte ein neues Merkmal erstellen, das Foo
erweitert, aber jeden Methodenaufruf "umschließt", zum Beispiel mit einer Druckanweisung (in Wirklichkeit wird das etwas komplizierter sein/ich habe ein paar verschiedene Anwendungsfälle im Sinn).Mixin, um jede Methode einer Scala-Eigenschaft zu wickeln
trait Foo {
def bar(x: Int) = 2 * x
def baz(y: Int) = 3 * y
}
Ich kann dies manuell tun, indem jede Methode überschrieben. Aber das scheint unnötig ausführliche (und nur allzu leicht die falsche Super-Methode zu nennen):
object FooWrapped extends FooWrapped
trait FooWrapped extends Foo {
override def bar(x: Int) ={
println("call")
super.bar(x)
}
override def baz(y: Int) ={
println("call")
super.baz(y)
}
}
scala> FooWrapped.bar(3)
call
res3: Int = 6
Ich habe gehofft, einen mixin Zug zu schreiben, dass ich mit anderen Zügen wieder zu verwenden wäre in der Lage, und die Verwendung als:
So muss ich nicht manuell jede Methode überschreiben (die Mixin würde dies für mich tun).
Ist es möglich, eine solche Mixin-Eigenschaft in Scala zu schreiben? Wie würde es aussehen?
Es sollte unter Verwendung der Makro Anmerkungen machbar sein (http: //docs.scala-lang .org/Übersichten/Makros/Anmerkungen), denke ich. Dies ist ein Kommentar, keine Antwort, weil ich das Makro im Moment nicht schreiben kann. –
Sie können das stapelbare Merkmalmuster auch verwenden, um ein bestimmtes Verhalten an vorhandene Merkmale anzuhängen, sodass Ihre Aufrufe wie folgt aussehen: val a = new SomeClass mit PrintCall mit Logger mit Whatever. Sie injizieren einfach die Verhaltensweisen in der Reihenfolge, in der sie ausgeführt werden sollen (im Fall von Drucken und Protokollieren ist dies egal, aber wenn Ihre Merkmale AddTwo und MultiplyByThree sind, ist die Reihenfolge wichtig). Ich schreibe im Kommentar, da es nicht wirklich das ist, wonach du gefragt hast, aber wenn du mit diesem Muster nicht vertraut bist, schau es dir an, es kann ziemlich cool sein (du musst jedoch jede Methode explizit überschreiben). – slouc
@slouc Ich hoffe auf eine Lösung, die nicht bedeutet, dass ich "Override Def Bar" manuell für jede Methode schreiben muss. Hauptsächlich, weil das bedeutet, dass ich das nicht allgemein schreiben kann (ohne vorher alle Methoden und Signaturen zu kennen). –