我有一个我无法修改的类:
class Foo {
def bar() = println("bar")
}
我想在运行时混入它的特性
trait Zee { this: Foo =>
abstract override def bar() = {
println("before bar")
super.bar()
}
}
抛出bar is not a member of Object with ScalaObject
我做错了什么?是否可以在不修改Foo
来源的情况下实现这一目标?
最终的客户端代码需要如下所示:
val foo = new Foo with Zee
foo.bar() // should print 'before bar' and then 'bar'
答案 0 :(得分:5)
你的Zee特征没有超级特征(除了来自ScalaObject的隐式继承),因此super不包含bar
的定义,并且没有任何覆盖或调用(super.bar)。
为什么不在没有自我参考的情况下写这个?
class Foo {
def bar() = println("bar")
}
trait Zee extends Foo {
abstract override def bar() = {
println("before bar")
super.bar()
}
}
答案 1 :(得分:3)
你可以在你的特质中扩展Foo类:
trait Zee extends Foo
您的代码将有效。
答案 2 :(得分:2)
你的特质需要extend
foo
trait Zee extends Foo {
abstract override def bar() = {
println("before bar")
super.bar()
}
}