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