快學Scala 第十八課 (trait多繼承)
阿新 • • 發佈:2017-08-23
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多繼承)