黑猴子的家:Scala 特質(zhì)構(gòu)造順序

特質(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()

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容