Traits und abstrakte Methoden überschreiben in Scala
Frage
Ich habe eine Basis abstrakte Klasse (Zug). Es hat eine abstrakte Methode foo()
. Es wird erweitert und von mehreren abgeleiteten Klassen implementiert. Ich möchte ein Merkmal schaffen, die so in den abgeleiteten Klassen gemischt werden kann, dass es foo()
implementiert und ruft dann die foo()
der abgeleiteten Klasse.
So etwas wie:
trait Foo {
def foo()
}
trait M extends Foo {
override def foo() {
println("M")
super.foo()
}
}
class FooImpl1 extends Foo {
override def foo() {
println("Impl")
}
}
class FooImpl2 extends FooImpl1 with M
habe ich versucht, Selbsttypen und Strukturtypen, aber ich kann es nicht an der Arbeit.
Lösung
Sie waren ganz in der Nähe. In den abstrakten Modifikator M.foo, und Sie haben die ‚stapelbare Trait‘ Muster: http: //www.artima.com/scalazine/articles/stackable_trait_pattern.html
trait Foo {
def foo()
}
trait M extends Foo {
abstract override def foo() {println("M"); super.foo()}
}
class FooImpl1 extends Foo {
override def foo() {println("Impl")}
}
class FooImpl2 extends FooImpl1 with M
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow