zoukankan      html  css  js  c++  java
  • 快学Scala 第二十课 (trait的构造顺序)

    trait的构造顺序:

    1. 首先调用超类构造器
    2. 特质构造器在超类构造器之后,类构造器之前执行
    3. 特质从左向右被构造
    4. 每个特质当中,父特质先被构造
    5. 如果多个特质共有一个父特质,而那个父特质已经被构造,则不会被再次构造
    6. 所有特质构造完毕,子类被构造
    class Account {
      println("Account constructor")
    }
    
    trait Logged {
      println("Logged constructor")
      def log(msg: String){ println("Logged")}
    }
    
    trait LongLogger extends Logged{
      println("LongLogger constructor")
       override def log(msg: String){
       println("LongLogger")  
         super.log(msg)
      }
      
    }
    
    trait ShortLogger extends Logged{
        println("ShortLogger constructor")  
       override def log(msg: String){
       println("ShortLogger")  
         super.log(msg)
      }
      
    }
    
    trait ConsoleLogger extends Logged {
      println("ConsoleLogger constructor")
      
     override def log(msg: String){
       println("ConsoleLogger")
        super.log(msg)
      }
      
    }
    
    trait DetailedLogger{
      println("DetailedLogger constructor")
       def log2(msg: String){
        println("DetailedLogger")
      }
      
    }
    
    class SavingsAccount extends Account with LongLogger with ShortLogger with ConsoleLogger {
      println("SavingsAccount constructor")
      log("funds")
      
    }
    
    new SavingsAccount() with DetailedLogger
    

    运行结果:

    Account constructor
    Logged constructor
    LongLogger constructor
    ShortLogger constructor
    ConsoleLogger constructor
    SavingsAccount constructor
    ConsoleLogger
    ShortLogger
    LongLogger
    Logged
    DetailedLogger constructor

  • 相关阅读:
    [SDOI2009]生日礼物(单调队列)
    [luogu1638]逛画展(单调队列)
    【最短路】·SPFA算法实现
    [UVA10474]大理石在哪儿
    【转载】C++中string erase函数的使用
    【转载】高精度减法的OP写法
    【转载】ST表
    串门赛: NOIP2016模拟赛——By Marvolo 丢脸记
    Bzoj 3813 奇数国 题解 数论+线段树+状压
    Bzoj 2064 分裂 题解
  • 原文地址:https://www.cnblogs.com/AK47Sonic/p/7429901.html
Copyright © 2011-2022 走看看