Черты и абстрактные методы переопределяются в 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