by shigemk2

当面は技術的なことしか書かない

abstract override

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