trait Logger5 {
def log(msg: String)
}
//因为有super,Scala认为log还是一个抽象方法
trait TimestampLogger5 extends Logger5 {
abstract override def log(msg: String) {
super.log(new java.util.Date() + " " + msg)
}
}
trait ShortLogger5 extends Logger5 {
abstract override def log(msg: String) {
super.log(if (msg.length <= 15) msg else s"${msg.substring(0, 12)}...")
}
}
trait ConsoleLogger5 extends Logger5 {
override def log(msg: String) {
println(msg)
}
}
class Account5 {
protected var balance = 0.0
}
abstract class SavingsAccount5 extends Account2 with Logger5 {
def withdraw(amount: Double) {
if (amount > balance) log("余额不足")
else balance -= amount
}
}
object Main5 extends App {
//这里可以根据5的知识点理解此处
//在特质中重写抽象方法从右向左
val acct1 = new SavingsAccount5 with ConsoleLogger5 with TimestampLogger5 with ShortLogger5
acct1.withdraw(100)
}
尖叫提示:实例化的时候,是从左往右,调用的时候是从右往左.
复写的是抽象的,override是可以省略的,复写的不是抽象的,override是不可以省略的,最好都加上override关键字