super呼び出し順序

  • インスタンス自体の呼び出しの次は、右端から順番に線形に処理される。ただし、同じtraitが2回以上登場する場合はその中でも一番左端のものが採用される。
object Main extends App {
  val first = new FirstClass()
  first.run()
}

class SecondClass { def run() { println("SecondClass") } }
trait ThirdTrait  extends SecondClass { override def run() { println("ThirdTrait"); super.run() } }
trait SecondTrait extends SecondClass { override def run() { println("SecondTrait"); super.run() } }
trait FirstTrait  extends SecondTrait { override def run() { println("FirstTrait"); super.run() } }
class FirstClass  extends SecondClass with ThirdTrait with FirstTrait { override def run() { println("FirstClass"); super.run() } }


FirstClass
FirstTrait
SecondTrait
ThirdTrait
SecondClass
class FirstClass  extends SecondClass with ThirdTrait with SecondTrait with FirstTrait { override def run() { println("FirstClass"); super.run() } }

FirstClass
FirstTrait
SecondTrait
ThirdTrait
SecondClass
class FirstClass  extends SecondClass with SecondTrait with ThirdTrait  with FirstTrait { override def run() { println("FirstClass"); super.run() } }

FirstClass
FirstTrait
ThirdTrait
SecondTrait
SecondClass