trait多继承

38 阅读2分钟

一,多个trait的加载顺序

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

例如: 1.png

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

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

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

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

运行结果:

C 特质构造器
B 特质构造器
A 特质构造器
child.....

二,多层trait加载顺序

先执行父类中的构造器,再执行子类的构造器:如果trait1也有自己的父类,要先执行父类构造器

2.png

/*
*
* 特质
* trait: 实现多继承
* trait多继承构造器的执行顺序
* 1, 先父  后子
* 2, 如果是多继承,有多个trait,按书写顺序从左到右
 */
object day74 {
    trait AA {
    println("AA 特质构造器")
    }
    trait  A extends AA{
    println("A     构造器")
  }
    trait B {
        println("B 特质构造器")
      }
    trait CC {
    println("CC 特质构造器")
  }
    trait C extends CC{
    println("C 特质构造器")
  }

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

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

顺序思路 4.png 运行结果 :

3.png

1.找出这个代码的错误并且修改:

6.png

修改如下:

import java.io.FileWriter

/*
*
 */
object day75 {


    trait FileLogger {
        
        println("fileLogger")

        val filename:String
        
        // 懒加载效果
        // 这个对象不会立刻去创建,而是等到你需要的时候才去创建

        lazy val writer = new FileWriter(filename)

        def writelog(msg:String) = {
            writer.write(msg)
            writer.close()
        }
    }
    class MyWriter extends  FileLogger {
        override val filename: String = "test.log"
    }//  继承三个特质 A B C

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