Scala特征混合秩序和超级呼叫

时间:2014-12-19 16:17:59

标签: scala mixins traits linearization

我有这段代码:

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

2 个答案:

答案 0 :(得分:1)

当您省略实施时,base是特质模板,并且具有不同的评估规则。请参阅Scala specification

答案 1 :(得分:1)

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