1

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

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'
4

3 回答 3

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()
  }
}
于 2012-08-14T14:28:22.130 回答
3

你可以在你的 trait 中扩展类 Foo :

trait Zee extends Foo

您的代码将起作用。

于 2012-08-14T14:28:54.310 回答
2

你的特质需要extendfoo

trait Zee extends Foo {
  abstract override def bar() = {
    println("before bar")
    super.bar()
  }
}
于 2012-08-14T14:29:23.657 回答