学んだことをなぐり書き


オーバーライドした場合の trait の挙動

trait T {
  def say() {
    println("trait T")
  }
}
class C extends T
val obj = new C
obj.say

// Javaのインターフェースのようにミックスインしていれば
// トレイトの型でも受けとることが出来る
val t: T = obj
t.say

class C2 extends T {
  // trait で定義してあるメソッドは override できる
  override def say() {
    println("class C2")
  }
}

val obj2 = new C2
obj2.say

val t2: T = obj2
// トレイトの型で受けとっても呼ばれるのはオーバーライドされたメソッドである
t2.say
trait T
trait T
class C2
class C2

同じ名前のメソッドを複数mix-inした場合

trait T1 { def func = println("trait T1") }
trait T2 { def func = println("trait T2") }
trait T3 { def func = println("trait T3") }

class C extends T1 with T2 with T3 {
  // 同じ名前のメソッドをmix-inした場合は override しなければならない
  override def func = super.func
  // 特に型を指定しない場合は右のが適応されるっぽい
  super.func
  // superの後に型を指定してやるとそちらのメソッドを呼ぶ
  super[T2].func
  super[T1].func
}
new C
trait T3
trait T2
trait T1

メンバーのみ編集できます