Scala черты смешанный порядок и супер звонок

У меня есть этот код:

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 ответа

Когда вы опускаете реализацию, base является шаблоном черты и имеет различные правила оценки. Смотрите спецификацию Scala

В Scala есть то, что называется линеаризацией типов. Он определяет порядок инициализации. Читайте здесь http://eed3si9n.com/constraining-class-linearization-in-Scala

Другие вопросы по тегам