`
yangbb
  • 浏览: 33323 次
  • 来自: ...
社区版块
存档分类
最新评论

scala的linearization

阅读更多
《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)
  • 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


可以在每个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()
}

输出为
Cat
HasTongue
HasTeeth
HasMouth
FourLegged
HasLegs
Furry
Animal

分享到:
评论

相关推荐

    scala-sbt-scala编译工具

    scala 编译工具 sbt 安装包。 Little or no configuration required for simple projects Scala-based build definition that can use the full flexibility of Scala code Accurate incremental recompilation ...

    scala sdk scala-2.12.3

    scala-2.12.3 scala-2.12.3 scala-2.12.3 scala-2.12.3

    Scala编程实战.zip

    此文档是讲解实战Scala,希望对喜欢大数据的同学有所帮助!!! 学习Scala语言,不仅仅意味着熟悉新的API,更重要的是一种思维方式的转变。从原有的面向对象编程(OO)到函数式编程(FP)的思想。本书面向实际的使用场景...

    Scala and Spark for Big Data Analytics.pdf

    Chapter 1, Introduction to Scala, will teach big data analytics using the Scalabased APIs of Spark. Spark itself is written with Scala and ... traits and trait linearization; and Java interoperability.

    Scala函数式编程

    很大篇幅都放在,使用scala实现scala默认库文件的API中,通过对简单的函数式编程逻辑的介绍和实践,主要是实践,建立起来一个比较明晰的scala思维模式,或者叫函数式编程的思维模式。 2 无副作用的函数式编程,同时...

    scala 2.13.3 API 文档 Html离线版 scala-api.rar

    最新制作 scala 2.13.3 API 文档 Html离线版 Scala 是一门多范式(multi-paradigm)的编程语言,设计初衷是要集成面向对象编程和函数式编程的各种特性。 Scala 运行在 Java 虚拟机上,并兼容现有的 Java 程序。

    scala五本经典资料集合

    scala是一个经典的语言,Scala代表了一个新的语言品种,它抹平了这些人为划分的界限。但是现在scala的相关学习资料不多,因此,本人总结了几篇写的较好的scala学习资料,包含<ScalaQuery_Commerzbank_2011><twitter-...

    scala编程中文pdf

    scala编程 33章 中文pdf Scala编程实战 目录 第1章字符串. 11 第2章数值39 第3章控制结构.60 第4章类和属性.103 第5章方法147 第6章对象170 第7章包和导入.190 第8章特质200 第9章函数式编程214 第10 章集合242 第...

    scala2.12.1Windows镜像包

    scala2.12.1Windows镜像包

    Scala实用指南

    本书是为想要快速学习或者正在学习 Scala 编程语言的 Java 开发者写的,循序渐进地介 绍了 Scala 编程语言的多个方面。 本书共分为 4 个部分:第一部分详细介绍 Scala 的一些基础知识,并和 Java 中的相关概 念进行...

    scala实战高清讲解

    scala编程进阶过程中不可或缺的书籍之一,详细介绍了scala语言的各种中高级语法,对于初学和高级开发人员有很大帮助

    scala3 scala3 scala3 scala3 scala3

    scala3 scala3 scala3 scala3 scala3

    最好的scala学习 课件

    最好的scala 学习课件,最好的scala 学习课件,学习spark必备

    eclipse插件 scala下载

    scala eclipse插件 拷贝到相应的目录即可使用,百度一大堆

    scala-compiler-2.11.8-API文档-中英对照版.zip

    赠送jar包:scala-compiler-2.11.8.jar; 赠送原API文档:scala-compiler-2.11.8-javadoc.jar; 赠送源代码:scala-compiler-2.11.8-sources.jar; 赠送Maven依赖信息文件:scala-compiler-2.11.8.pom; 包含翻译后...

    scala-xml_2.11-1.0.4-API文档-中英对照版.zip

    赠送jar包:scala-xml_2.11-1.0.4.jar; 赠送原API文档:scala-xml_2.11-1.0.4-javadoc.jar; 赠送源代码:scala-xml_2.11-1.0.4-sources.jar; 赠送Maven依赖信息文件:scala-xml_2.11-1.0.4.pom; 包含翻译后的API...

    scala-parser-combinators-2.11-1.0.4-API文档-中文版.zip

    赠送jar包:scala-parser-combinators_2.11-1.0.4.jar; 赠送原API文档:scala-parser-combinators_2.11-1.0.4-javadoc.jar; 赠送源代码:scala-parser-combinators_2.11-1.0.4-sources.jar; 赠送Maven依赖信息...

    差分进化算法的Scala实现_Scala_代码_下载

    差分进化算法的Scala实现_Scala_代码_下载

    快学scala 完整

    快学scala 完整清晰版 大数据spark 主要的编程语言 快学scala 完整清晰版 大数据spark 主要的编程语言

Global site tag (gtag.js) - Google Analytics