scala中多个trait同名方法的调用顺序
Scala中支持让类继承多个trait后,可依次调用多个trait中的同名方法,只要让多个trait中的同名方法,在override的方法内调用super关键字即可。例如:
trait HandlerTrait {
def handle(data: String) = {println("last one")}
}
trait DataValidHandlerTrait extends HandlerTrait {
override def handle(data: String) = {
println("check data: " + data)
super.handle(data)
}
}
trait SignatureValidHandlerTrait extends HandlerTrait {
override def handle(data: String) = {
println("check signature: " + data)
super.handle(data)
}
}
class PersonForRespLine(val name: String) extends SignatureValidHandlerTrait with DataValidHandlerTrait {
def sayHello = {
println("Hello, " + this.name)
this.handle(this.name)
}
}
object PersonForRespLine{
def main(args: Array[String]) {
val p=new PersonForRespLine("tom")
p.sayHello
//执行结果:
// Hello, tom
// check data: tom
// check signature: tom
// last one
}
}
- 可以发现,上面的代码中调用多个trait中同名方法时,首先会从最右边的trait的方法开始执行,然后依次往左执行,形成一个调用链条,最后执行HandlerTrait也就是super的方法。这是因为每个trait在override该方法时都在最后调用了super.handle。
- 如果是在override的最开始调用super.handle,则会首先调用super的方法,然后再从右往左执行各trait的同名方法。