7

私はこのコードを持っています:

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なぜですか?

4

2 に答える 2

1

実装を省略した場合、basetrait のテンプレートであり、評価規則が異なります。Scala 仕様を参照してください

于 2014-12-19T17:31:58.223 に答える
1

Scala には、型の線形化と呼ばれるものがあります。初期化順序を定義します。ここを読むhttp://eed3si9n.com/constraining-class-linearization-in-Scala

于 2014-12-19T19:06:41.050 に答える