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
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
最新コメント