Переопределение признаков и абстрактных методов в 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
Я пробовал типы self и структурные типы, но я не могу заставить его работать.
1 ответ:
Вы были очень близки. Добавьте абстрактный модификатор в 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