《Programming in scala,3rd Edition》chapter12.6后,尝试自己绘制了下linearization
书本示例中除了最后的Cat的申明用了with,其他的trait/class都只有extends,即单一继承。
这里构造了相对复杂的情况来说明linearization是怎样的。

          class Animal          trait Furry extends Animal          trait HasLegs extends Animal          trait HasMouth extends Animal          trait HasTeeth extends HasMouth          trait HasTongue extends Animal with HasMouth with HasTeeth          trait FourLegged extends HasLegs          class Cat extends Animal with Furry with FourLegged with HasTongue with HasTeeth

分析过程(省略AnyRef和Any)
[list]
[*]1.根据Cat的声明构造第一级的linearization
Cat-->HasTeeth-->HasTongue-->FourLegged-->Furry-->Animal
[*]2.依次对这个linearization上从右往左的每个class/trait,构造自己的linearization(到AnyRef-->Any为止,下列数据省略AnyRef和Any)
Animal的linearization:Animal
Furry的linearization:Furry-->Animal
FourLegged的linearization:FourLegged-->HasLegs
HasLegs的linearization:HasLegs-->Animal
代入后为FourLegged-->HasLegs-->Animal
HasTongue的linearization:HasTongue-->HasTeeth-->HasMouth
HasMouth的linearization:HasMouth-->Animal
HasTeeth的linearization:HasTeeth-->HasMouth,代入后为HasTeeth-->HasMouth-->Animal
代入后为HasTongue-->HasTeeth-->HasMouth-->Animal-->HasMouth-->Animal
抹除前面的重复class/trait:HasTongue-->HasTeeth-->HasMouth-->Animal
[*]3.将步骤2输出的各个linearization代入到1的输出中
Cat-->{HasTeeth-->HasMouth-->Animal}-->{HasTongue-->HasTeeth-->HasMouth-->Animal}-->{FourLegged-->HasLegs-->Animal}-->{Furry-->Animal}-->Animal
[*]4.抹除前面重复的class/trait:
Cat-->{}-->{HasTongue-->HasTeeth-->HasMouth}-->{FourLegged-->HasLegs}-->{Furry}-->Animal

Cat-->HasTongue-->HasTeeth-->HasMouth-->FourLegged-->HasLegs-->Furry-->Animal

[/list]
可以在每个class/trait中都增加一个act方法,打印特定字符后调用super.act,进行验证

package org.study.scala.ch12

class Animal{  def act():Unit = {    println("Animal")  }}trait Furry extends Animal{  override def act():Unit = {    println("Furry")    super.act()  }}trait HasLegs extends Animal{  override def act():Unit = {    println("HasLegs")    super.act()  }}

trait HasMouth extends Animal{  override def act():Unit = {    println("HasMouth")    super.act()  }}

trait HasTeeth extends HasMouth{  override def act():Unit = {    println("HasTeeth")    super.act()  }}

trait HasTongue extends Animal with HasMouth with HasTeeth{  override def act():Unit = {    println("HasTongue")    super.act()  }}trait FourLegged extends HasLegs{  override def act():Unit = {    println("FourLegged")    super.act()  }}class Cat extends Animal with Furry with FourLegged with HasTongue with HasTeeth{  override def act():Unit = {    println("Cat")    super.act()  }}

object LinearizationTest extends App{  val cat = new Cat  cat.act()}

输出为

CatHasTongueHasTeethHasMouthFourLeggedHasLegsFurryAnimal

scala的linearization相关推荐

  1. scala 线性回归_Scala的特征线性化

    scala 线性回归 Scala | 特性线性化 (Scala | Trait Linearization) In Scala programming language, trait lineariz ...

  2. scala面试问题_Scala面试问题

    scala面试问题 Before reading this post, please go through my previous post at "Scala Basic Intervie ...

  3. 【Scala】特质与特质的线性化

    特质 Scala里相当于Java接口的是Trait(特征).实际上它比接口还功能强大.与接口不同的是,它还可以定义属性和方法的实现.Scala中特征被用于服务于单一目的功能模块的模块化中.通过混合这种 ...

  4. hadoop,spark,scala,flink 大数据分布式系统汇总

    20220314 https://shimo.im/docs/YcPW8YY3T6dT86dV/read 尚硅谷大数据文档资料 iceberg相当于对hive的读写,starrocks相当于对mysq ...

  5. 2021年大数据常用语言Scala(三十八):scala高级用法 隐式转换和隐式参数

    目录 隐式转换和隐式参数 隐式转换 自动导入隐式转换方法 隐式转换的时机 隐式参数 隐式转换和隐式参数 隐式转换和隐式参数是scala非常有特色的功能,也是Java等其他编程语言没有的功能.我们可以很 ...

  6. 2021年大数据常用语言Scala(三十七):scala高级用法 高阶函数用法

    目录 高阶函数用法 作为值的函数 匿名函数 柯里化(多参数列表) 闭包 高阶函数用法 Scala 混合了面向对象和函数式的特性,在函数式编程语言中,函数是"头等公民",它和Int. ...

  7. 2021年大数据常用语言Scala(三十六):scala高级用法 泛型

    目录 泛型 定义一个泛型方法 定义一个泛型类 上下界 协变.逆变.非变 非变 协变 逆变 泛型 scala和Java一样,类和特质.方法都可以支持泛型.我们在学习集合的时候,一般都会涉及到泛型. sc ...

  8. 2021年大数据常用语言Scala(三十五):scala高级用法 提取器(Extractor)

    目录 提取器(Extractor) 定义提取器 提取器(Extractor)  我们之前已经使用过scala中非常强大的模式匹配功能了,通过模式匹配,我们可以快速匹配样例类中的成员变量.例如: // ...

  9. 2021年大数据常用语言Scala(三十四):scala高级用法 异常处理

    目录 异常处理 捕获异常 抛出异常 异常处理 Scala中 无需在方法上声明异常 来看看下面一段代码. def main(args: Array[String]): Unit = {val i = 1 ...

  10. 2021年大数据常用语言Scala(三十一):scala面向对象 特质(trait)

    目录 特质(trait) 作为接口使用 定义具体的方法 定义具体方法和抽象方法 定义具体的字段和抽象的字段 实例对象混入trait trait调用链 trait的构造机制 trait继承class 特 ...

最新文章

  1. 排序算法7---快速排序算法
  2. 【7.6.3】基于每个具体类一张表的继承映射
  3. Pycharm自定义包的导入
  4. python 读取json转为docx_在Python中进行JSON转化
  5. LeetCode 2064. 分配给商店的最多商品的最小值(二分查找)
  6. 现代软件工程 作业 1 个人项目
  7. 干货|219个opencv常用函数汇总
  8. 想要改变自己,请先突破这3个自我限制
  9. 贺利坚老师汇编课程56笔记:CMP指令
  10. 西瓜创客的python_西瓜创客Python客户端
  11. 【推荐】无线WiFi信号测试软件WirelessMon
  12. Android Wi-Fi源码分析之wpa_supplicant初始化(三):wpa_supplicant_add_iface函数分析
  13. 给dalao们递dalao们的博客
  14. 收集的 Linux VPS 在线重装系统脚本
  15. Go webrtc项目pion创始人专访 | Gopher Daily (2021.04.07) ʕ◔ϖ◔ʔ
  16. 港中文旷视提出PanopticFCN:用于全景分割的全卷积网络
  17. 使用机器学习模型预测贷款资格
  18. 关于DSP28335的CAN模块与上位机(PC)通信调试心得(1)
  19. 超分辨率的国内外研究现状
  20. 易飞ERP和钉钉办公集成——ERP移动审批解决方案

热门文章

  1. NerveBridge 助力 YF 和 Bingoo 社区实现资产跨链
  2. 视频大数据与物联网(IoT)融合发展的探索
  3. SAP ABAP MOVE-CORRESPONDING ... TO ...的使用
  4. 2014中国互联网安全大会
  5. 清除hao123浏览器劫持小尾巴病毒
  6. 爬了我的微信好友,原来他们是这样的...
  7. 正点原子stm32视频教程第7~10节知识总结
  8. 2018百度云智峰会,为什么百度大脑站C位?
  9. sudo报错及在linux上启动jar包时报错java.net.UnknownHostException
  10. QT常用函数和总结(持续更新)