web-dev-qa-db-fra.com

Les traits et les méthodes abstraites ont priorité sur Scala

J'ai une classe abstraite de base (trait). Il a une méthode abstraite foo(). Il est étendu et implémenté par plusieurs classes dérivées. Je veux créer un trait qui peut être mélangé dans les classes dérivées afin qu'il implémente foo() puis appelle la foo() de la classe dérivée.

Quelque chose comme:

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 

J'ai essayé les types autonomes et les types structurels, mais je ne peux pas le faire fonctionner.

61
IttayD

Tu étais très proche. Ajoutez le modificateur abstrait à M.foo, et vous obtenez le modèle 'Stackable Trait': 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
97
retronym