标签:ogg 相同 div extend over 一个 类的继承 int super
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)
}
}
标签:ogg 相同 div extend over 一个 类的继承 int super
原文地址:http://www.cnblogs.com/AK47Sonic/p/7420433.html