1. 程式人生 > >快學Scala 第十八課 (trait多繼承)

快學Scala 第十八課 (trait多繼承)

rtl 思想 logs err fun 含義 tex color saving

trait多繼承:

trait的繼承並不像類擁有相同的含義!在下面這個例子中,如果還是運用類的繼承的思想,那麽運行結果將是什麽也沒有。

trait Logged {
  def log(msg: String){ }
}

trait ConsoleLogger extends Logged {
 override def log(msg: String){
       super.log(msg)

  }
  
}

但是事實並非如此:

trait Logged {
  def log(msg: String){ println("Logged")}
}


trait ConsoleLogger extends Logged {
 override def log(msg: String){
   println("ConsoleLogger")
       super.log(msg)
  }
  
}

trait ShortLogger extends Logged{
   override def log(msg: String){
   println("ShortLogger")
  }
  
}

class SavingsAccount extends ShortLogger with ConsoleLogger {
  println("SavingsAccount")
  log("funds")
  
}

new SavingsAccount()

運行結果:

SavingsAccount
ConsoleLogger
ShortLogger

由上可見,super.log通常調用trait從最後一個開始,從右往左調用。但是如果右邊的trait是左邊trait的超類,那麽次序會調換,先調用子再調用父。

如果想要強制調用父trait,則可使用以下方式:

trait ConsoleLogger extends Logged {
 override def log(msg: String){
   println("ConsoleLogger")
    super[Logged].log(msg)

  }
  
}

快學Scala 第十八課 (trait多繼承)