Scala特质构成问题

时间:2012-08-14 14:22:02

标签: scala traits

我有一个我无法修改的类:

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'

3 个答案:

答案 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()
  }
}