Черты и абстрактные методы переопределяются в Scala

У меня есть базовый абстрактный класс (черта). Имеет абстрактный метод foo(), Он расширен и реализован несколькими производными классами. Я хочу создать черту, которую можно смешивать с производными классами, чтобы она реализовывала foo() а затем вызывает производный класс foo(),

Что-то вроде:

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 

Я пробовал собственные типы и структурные типы, но я не могу заставить его работать.

1 ответ

Решение

Вы были очень близки Добавьте модификатор abstract в M.foo, и вы получите шаблон "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
Другие вопросы по тегам