61 votes

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 souhaite créer un trait pouvant être mélangé dans les classes dérivées afin qu'il implémente foo() et appelle ensuite les classes dérivées foo() .

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é des types individuels et des types structurels, mais je ne peux pas le faire fonctionner.

97voto

retronym Points 35066

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X