trait

33 阅读2分钟

trait是一个与继承有关系的一项代码方法,它具有自己的执行特质与执行顺序 内容如下:

特质:
trait 实现多继承
trait多继承构造器的执行顺序
1. 先父 后子
* 2. 如果是多继承, 有多个trait, 按书写顺序从左到右

可以输入以下代码:

package level02

/*
特质:
trait 实现多继承
trait多继承构造器的执行顺序
1. 先父 后子
* 2. 如果是多继承, 有多个trait, 按书写顺序从左到右
 */
object class17 {

  trait A {
    println("A 特质构造器")
  }

  trait B {
    println("B 特质构造器")
  }

  trait C {
    println("C 特质构造器")
  }

  class Child() extends C with B with A{
    println("child ...")
  } // 继承 三个特质A,B,C

  def main(args: Array[String]): Unit = {
    val child = new Child()
  }
}

运行结果如图所示:

image.png 再添加一些内容,可以输入以下代码:

/*
特质:
trait 实现多继承
trait多继承构造器的执行顺序
1. 先父 后子
* 2. 如果是多继承, 有多个trait, 按书写顺序从左到右
 */
object class18 {

  trait AA {
    println("AA 特质构造器")
  }

  trait A extends AA {
    println("A 构造器")
  }

  trait B {
    println("B 特质构造器")
  }

  trait CC {
    println("CC 特质构造器")
  }

  trait C extends CC {
    println("C 构造器")
  }

  class Child() extends C with B with A {
    println("child ...")
  } // 继承 三个特质A,B,C

  def main(args: Array[String]): Unit = {
    val child = new Child()
  }
}

运行结果如图所示:

image.png 还可以输入以下代码:

package level02

import java.io.FileWriter

/*
 *
 */
object class19 {

  trait FileLogger{
    println("FileLogger")

    val filename:String

    //// 懒加载效果
    //// 这个对象不会立刻创建,而是等到你需要使用的时候才去创建
    lazy val writer = new FileWriter(filename)

    def writeLog(msg:String): Unit = {
      writer.write(msg)
      writer.close()
    }
  }

  class MyWriter extends FileLogger {
    println("MyWriter")

    override val filename: String = "test.log"
  } // 继承 三个特质A,B,C

  def main(args: Array[String]): Unit = {
    val log = new MyWriter()
    log.writeLog("测试内容")
  }
}

image.png