abstract宣言されたメソッドの中でsuperの呼び出しを行っている。 この場合、メソッドの具体的な定義がしてあるクラスやトレイトの後で ミックスインされているのであれば正しく動く。
定義内容が動的に束縛される。
こういう処理をやるためにはabstract overrideを使う。
abstract class Engineer { println ("class Engineer constructor") def work(time:Int) } class Person extends Engineer { println ("class Person constructor") def work(time:Int) { println ("Person#work start") println ("1つのタスクを"+time+"分で行います") println ("Person#work end") } } trait Programmer extends Engineer { println("trait Programmer constructor") abstract override def work(time:Int) = { println("Programmer#work start") super.work(time - 15) println("Programmer#work end") } } object Engineer { def main(args: Array[String]) { var p1 = new Person println(p1.work(60)) var p2 = new Person with Programmer println(p2.work(60)) } }
workメソッドを呼ぶとProgrammerトレイトのworkメソッドを呼び、そのあとにPersonクラスのworkを実行する。
$ scala Engineer class Engineer constructor class Person constructor Person#work start 1つのタスクを60分で行います Person#work end class Engineer constructor class Person constructor trait Programmer constructor Programmer#work start Person#work start 1つのタスクを45分で行います Person#work end Programmer#work end