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.

War es hilfreich?

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
scroll top