快学Scala 第十八课 (trait多继承)
Posted AK47Sonic
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了快学Scala 第十八课 (trait多继承)相关的知识,希望对你有一定的参考价值。
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多继承)的主要内容,如果未能解决你的问题,请参考以下文章