首页 > 其他 > 详细

Scala 关于叠加特性的理解

时间:2020-04-25 21:47:14      阅读:62      评论:0      收藏:0      [点我收藏+]

代码示例

package com.atguigu.chapter08.mixin

//看看混入多个特质的特点(叠加特质)
object AddTraits {
  def main(args: Array[String]): Unit = {

    val mysql = new MySQL4 with DB4 with File4
    println(mysql)
    mysql.insert(100)

    println("===================================================")
  
  }
}

trait Operate4 { //特点
  println("Operate4...")

  def insert(id: Int) //抽象方法
}

trait Data4 extends Operate4 { //特质,继承了Operate4
  println("Data4")

  override def insert(id: Int): Unit = { //实现/重写 Operate4 的insert
    println("插入数据 = " + id)
  }
}

trait DB4 extends Data4 { //特质,继承 Data4
  println("DB4")

  override def insert(id: Int): Unit = { // 重写 Data4 的insert
    println("向数据库")
    super.insert(id)
  }
}

trait File4 extends Data4 { //特质,继承 Data4
  println("File4")

  override def insert(id: Int): Unit = { // 重写 Data4 的insert
    println("向文件")
    super.insert(id) //调用了insert方法(难点),这里super在动态混入时,不一定是父类
    //如果我们希望直接调用Data4的insert方法,可以指定,如下
    //说明:super[?] ?的类型,必须是当前的特质的直接父特质(超类)
   // super[Data4].insert(id)
  }
}

class MySQL4  {} //普通类

关系图

技术分享图片

 

 

问题

在构建对象时,它的构建顺序是

Scala在叠加特质的时候,会从左到右依次构建:

    构建完MySQL4之后开始构建DB4==》DB4的父特质是Data4,所以会先构建Data4 ==》Data4 的父特质是Operate4,所以先构建Operate4 ==》所有父类构建完成之后,DB4开始完成自己的构造==》

    开始构造FIle4时,依然还是会先找父类构造,但因为父类之前已经被构造过,所以就跳过,直接构造自己

所以输出为
1.Operate4...    
2.Data4
3.DB4
4.File4

当我们执行一个动态混入对象的方法,其执行顺序是怎样的

顺序是,(1)从右到左开始执行 , (2)当执行到super时,是指的左边的特质 (3) 如果左边没有特质了,则super就是父特质

所以输出为:

1. 向文件"
2. 向数据库
3. 插入数据 100

Scala 关于叠加特性的理解

原文:https://www.cnblogs.com/yangxusun9/p/12775396.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!