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

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 sdk scala-2.12.3

    Scala SDK,全称为Scala Software Development Kit,是用于开发Scala应用程序的核心工具集。Scala是一种多范式的编程语言,融合了面向对象和函数式编程的特点,它运行在Java虚拟机(JVM)上,能够充分利用Java生态...

    scala3 scala3 scala3 scala3 scala3

    Scala3,也被称为Scala 3或Dotty,是Scala编程语言的一个重大更新,旨在提高其简洁性、可读性和类型安全性。Scala3的发布标志着该语言的进一步成熟,它引入了一系列改进,旨在解决早期版本中的一些痛点,同时保持对...

    scala2.12.1Windows镜像包

    Scala是一种强大的多范式编程语言,它融合了面向对象和函数式编程的概念。这个"scala2.12.1Windows镜像包"是为Windows操作系统设计的Scala编程环境的安装包,版本号为2.12.1。Scala 2.12.x系列是其重要的一个稳定...

    scala-2.12.10.zip

    Scala是一种强大的多范式编程语言,它融合了面向对象和函数式编程的概念。这个"scala-2.12.10.zip"文件是Scala编程语言的特定版本——2.12.10,专为Windows操作系统设计的安装包。Scala 2.12.x系列是该语言的一个...

    scala + mybatis 数据库查询

    Scala是一种强大的多范式编程语言,它结合了面向对象和函数式编程的特性。MyBatis则是一款流行的Java持久层框架,主要用于简化数据库操作。在本项目中,"scala + mybatis 数据库查询",我们将探讨如何将Scala与...

    scala-2.12.10.tgz

    Scala是一种强大的多范式编程语言,它融合了面向对象和函数式编程的概念。Scala运行在Java虚拟机(JVM)上,并且可以充分利用Java的生态系统。`scala-2.12.10.tgz`是一个针对Linux操作系统的Scala安装包,它的版本号...

    scala实战高清讲解

    Scala是一种强大的多范式编程语言,它融合了面向对象和函数式编程的特性,使得它在处理并发和大数据分析方面表现出色。"Scala实战高清讲解"这本书是学习Scala的宝贵资源,尤其对于那些希望深入理解并提升Scala技能的...

    Scala语法简明教程

    ### Scala语法简明教程知识点详解 #### Scala语言简史 - **诞生历史**:Scala起源于瑞士联邦理工学院洛桑(EPFL),由Martin Odersky在2001年开始设计,其灵感来源于Funnel——一种结合了函数式编程思想与Petri网...

    scala-2.11.8.rar

    Scala是一种强大的多范式编程语言,它融合了面向对象和函数式编程的特性。这个"scala-2.11.8.rar"压缩包包含了Scala语言的2.11.8版本的源代码,这对于理解Scala的工作原理、学习高级编程技巧以及进行自定义扩展或...

    最好的scala学习 课件

    Scala是一种强大的多范式编程语言,它融合了面向对象和函数式编程的特性,被广泛应用于大数据处理领域,特别是与Apache Spark相结合时。本课件是针对Scala学习者精心准备的资源,旨在帮助你深入理解和掌握Scala的...

    Scala考试题1

    Scala 是一种多范式的编程语言,它融合了面向对象和函数式编程的特性。下面将详细解释题目中涉及的Scala知识点: 1. **var、val 和 def 的区别**: - `var` 定义可变变量,可以多次赋值。 - `val` 定义不可变变量...

    scala-2.12.14.zip&scala-2.12.11.tgz Linux版本压缩包.rar

    Scala是一种强大的多范式编程语言,它融合了面向对象编程和函数式编程的概念,被广泛应用于大数据处理和分布式计算领域,特别是在Apache Spark等框架中。标题提到的"scala-2.12.14.zip&scala-2.12.11.tgz"是Scala的...

    windows版scala-2.11.12.zip

    在这个"windows版scala-2.11.12.zip"压缩包中,包含的是Scala 2.11.12版本的Windows兼容安装文件,这是Scala的一个稳定版本,适用于开发人员在Windows操作系统上进行Scala编程。 Scala 2.11.x系列是Scala的一个主要...

    学习scala好的项目

    Scala是一种强大的多范式编程语言,它融合了面向对象和函数式编程的特性,被广泛应用于大数据处理、分布式计算和Web开发等领域。Spark是基于Scala构建的大数据处理框架,其高性能和易用性使得Scala在大数据领域备受...

    scala学习源代码

    Scala是一种强大的多范式编程语言,它融合了面向对象和函数式编程的特性。这个"scala学习源代码"的压缩包文件很可能包含了用于教学或自我学习Scala编程的基础示例。让我们深入了解一下Scala语言的关键概念和特性。 ...

    scala-2.11.12 win msi 安装包

    Scala是一种强大的多范式编程语言,它融合了面向对象和函数式编程的概念。这个压缩包提供的文件是"scala-2.11.12 win msi 安装包",适用于Windows操作系统,版本号为2.11.12。这个版本的Scala是官方发布的,虽然原...

    Programming.in.Scala.pdf

    从上述内容来看,《Programming in Scala.pdf》不仅是一本介绍Scala编程语言的书籍,更是一本为读者提供深入了解和应用Scala语言的实用工具。书籍中的内容覆盖了从基础知识到高级特性的多个层面,确保读者能够在掌握...

    Scala-2.11.1.zip

    Scala是一种强大的静态类型编程语言,它融合了面向对象和函数式编程的概念,旨在提供一种可扩展的、高效的编程环境。Scala这个名字是“Scalable Language”的缩写,它旨在克服Java的一些局限性,同时保留其平台兼容...

Global site tag (gtag.js) - Google Analytics