特質(zhì)也是有構(gòu)造器的,構(gòu)造器中的內(nèi)容由“字段的初始化”和一些其它語(yǔ)句構(gòu)成
初始實(shí)例化,是從左到右,調(diào)用是從右到左
trait Logger9 {
println("我在Logger9特質(zhì)構(gòu)造器中,嘿嘿嘿。。。")
def log(msg: String)
}
trait ConsoleLogger9 extends Logger9 {
println("我在ConsoleLogger9特質(zhì)構(gòu)造器中,嘿嘿嘿。。。")
def log(msg: String) {
println(msg)
}
}
trait ShortLogger9 extends Logger9 {
val maxLength: Int
println("我在ShortLogger9特質(zhì)構(gòu)造器中,嘿嘿嘿。。。")
abstract override def log(msg: String) {
super.log(if (msg.length <= maxLength) msg else s"${msg.substring(0, maxLength - 3)}...")
}
}
class Account9 {
println("我在Account9構(gòu)造器中,嘿嘿嘿。。。")
protected var balance = 0.0
}
abstract class SavingsAccount9 extends Account9 with ConsoleLogger9 with ShortLogger9{
println("我再SavingsAccount9構(gòu)造器中")
var interest = 0.0
override val maxLength: Int = 20
def withdraw(amount: Double) {
if (amount > balance) log("余額不足")
else balance -= amount
}
}
object Main9 extends App {
val acct = new SavingsAccount9 with ConsoleLogger9 with ShortLogger9
acct.withdraw(100)
println(acct.maxLength)
}
步驟總結(jié)
(1)調(diào)用當(dāng)前類的超類構(gòu)造器
(2)第一個(gè)特質(zhì)的父特質(zhì)構(gòu)造器
(3)第一個(gè)特質(zhì)構(gòu)造器
(4)第二個(gè)特質(zhì)構(gòu)造器的父特質(zhì)構(gòu)造器由于已經(jīng)執(zhí)行完成,所以不再執(zhí)行
(5)第二個(gè)特質(zhì)構(gòu)造器
(6)當(dāng)前類構(gòu)造器
類和特質(zhì)是兩個(gè)概念,在這里區(qū)分開來
A extends C
B extends C
new A()
new B()