Scala特质的混入顺序和super调用

7

I have this code:

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为:

trait base{
  def msg: Unit
}

它会输出像这样的内容:base 2,foo,done

我理解with的顺序是从右到左的(最后一个先出现),但extends呢?为什么有时会打印base2,而有时候是base


这种怪异现象就是我避免使用蛋糕模式的原因。 - samthebest
如果它像Groovy一样运作,那么你需要在base trait中添加super.msg,这样它就会链接到你的base2类。如果base没有实现,那么foosuper.msg将调用base2 - MaciejGórski
2个回答

1
当您省略实现时,base是一个特质的模板,并具有不同的评估规则。请参见Scala规范

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接