【scala】traitの構造順序

6535 ワード

traitの構築順序:
  • まずスーパークラスコンストラクタ
  • を呼び出す.
  • 特質コンストラクタは、スーパークラスコンストラクタの後、クラスコンストラクタの前に
  • を実行する.
  • 特質を左から右へ造る
  • .
  • 各特質のうち、親特質はまず
  • に構築される.
  • 複数の特質が1つの親特質を共有する、その親特質がすでに構築されている場合、
  • は再構築されない.
  • すべての特質構造が完了し、サブクラスは
  • に構築される.
    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