7

我有这个代码:

trait base{
  def msg: Unit= {
    println{"base"}
  }
}

trait foo extends base {
  abstract override def msg: Unit ={
    super.msg
    println("foo")
  }
}

class base2{
  def msg:Unit = {
    println{"base 2"}
  }
}

class test extends base2 with foo{
   override def msg: Unit ={
    super.msg
    println("done")
  }
}

如果我打电话(new test).msg,这会打印出如下内容:base, foo, done

但是,如果我将基本特征更改为:

trait base{
  def msg: Unit
}

它打印出如下内容:base 2, foo, done

我知道的顺序with是从右到左(最后一个在前)但是怎么样extends?为什么有时它会打印base2,但有时base呢?

4

2 回答 2

1

Scala 有一种叫做类型线性化的东西。它定义了初始化顺序。在这里阅读http://eed3si9n.com/constraining-class-linearization-in-Scala

于 2014-12-19T19:06:41.050 回答
1

当你省略实现时,base是一个特征的模板并且有不同的评估规则。请参阅Scala 规范

于 2014-12-19T17:31:58.223 回答