trait多继承详解

38 阅读2分钟

特质

特质:实现多继承 trait多继承构造器的执行顺序

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

  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()
  }
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()
}
import java.io.FileWriter
//*
//*
object sc03 {
    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("测试内容")
    }
  }

trait 和 class 的区别

  1. class 类。伴生类,抽象类,内部类。不能多继承。
  2. trait 特质。可以多继承。构造器不能带参数。extends with

共同点

  1. 都可以有:具体属性,抽象属性,具体方法,抽象方法
  2. 都使用extends来做继承
import java.io.FileWriter
  /*
  trait 和 class 的区别
  1. class 类。伴生类,抽象类,内部类。不能多继承。
  2. trait 特质。可以多继承。构造器不能带参数。extends  with

  共同点
  1. 都可以有:具体属性,抽象属性,具体方法,抽象方法
  2. 都使用extends来做继承
  */
  object sc04 {
    
    class A{}
    trait B{}

    class AB extends A with B{
    }

    def main(args: Array[String]): Unit = {
    }
  }