scala中trait的定义使用

13 阅读1分钟

多个trait的加载顺序

一个类实现了多个特质之后,所涉及的多个构造器的执行顺序如何确定?

如果有多个父类,则按照从左到右的顺序调用

package txy

object Demo17 {
  def main(args: Array[String]): Unit = {
    trait A {
      println("A")
    }
    trait B {
      println("B")
    }
    class Trait extends A with B {
      println("C")
    }
    new Trait
  }
}

先父后子,父类从左到右

package txy

object Demo17 {
  def main(args: Array[String]): Unit = {
    trait A {
      println("A")
    }
    trait B {
      println("B")
    }
    trait C extends B {
      println("C")
    }
    class Trait extends C with A {
      println("D")
    }
    new Trait
  }
}

懒加载:赋值时不加载,等到调用时才加载

应用场景:

package txy
import java.io.FileWriter
object Demo18 {
  trait FileLogger {
    val filename:String
    //val filewriter =new FileWriter(filename,true)
    lazy val filewriter =new FileWriter(filename,true)
    def writeLog(msg:String): Unit = {
      filewriter.write(msg)
      filewriter.close()
    }
  }
  class MyFileLogger extends FileLogger{
    override val filename = "11-26.log"
  }
  def main(args: Array[String]): Unit = {
    val filelogger = new MyFileLogger()
    filelogger.writeLog("上午上scala课程")
  }
}