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
原文:https://www.cnblogs.com/yangxusun9/p/12775396.html