美文网首页
Scala Trait 的线性化

Scala Trait 的线性化

作者: scandly | 来源:发表于2018-08-15 00:02 被阅读0次

Scala Trait调用super方法的线性化是一个难理解的内容,下面让我通过一段代码来推演线性化过程。

源代码:

package c5soft

class SuperBase {

def show() {

println("Here step to class SuperBase")

println("I'm " + toString + "\n")

}

}

trait TraitBase extends SuperBase {

override def toString = "trait TraitBase"

override def show() {

println("Here step to trait TraitBase")

super.show()

}

}

trait A extends TraitBase {

override def toString = "trait A"

override def show() {

println("Here step to trait A")

super.show()

}

}

trait AChild extends A {

override def toString = "trait AChild"

override def show() {

println("Here step to trait AChild")

super.show()

}

}

trait B extends TraitBase {

override def toString = "trait B"

override def show() {

println("Here step to trait B")

super.show()

}

}

trait BChild extends B {

override def toString = "trait BChild"

override def show() {

println("Here step to trait BChild")

super.show()

}

}

class C extends SuperBase {

override def toString = "class C"

override def show() {

println("Here step to class C")

super.show()

}

}

object Main extends App {

println("----------C.show-----")

new C show()

println("----------CA.show-----")

new C with A show()

println("----------CB.show-----")

new C with B show()

println("---------CAB.show----")

new C with A with B show()

println("---------CaB.show----")

new C with AChild with B show()

println("---------CBA.show----")

new C with B with A show()

println("---------CBa.show----")

new C with B with AChild show()

println("---------Cab.show----")

new C with AChild with BChild show()

println("---------Ca.show----")

new C with AChild show()

}

输出结果:

----------C.show-----

Here step to class C

Here step to class SuperBase

I'm class C

----------CA.show-----

Here step to trait A

Here step to trait TraitBase

Here step to class C

Here step to class SuperBase

I'm trait A

----------CB.show-----

Here step to trait B

Here step to trait TraitBase

Here step to class C

Here step to class SuperBase

I'm trait B

---------CAB.show----

Here step to trait B

Here step to trait A

Here step to trait TraitBase

Here step to class C

Here step to class SuperBase

I'm trait B

---------CaB.show----

Here step to trait B

Here step to trait AChild

Here step to trait A

Here step to trait TraitBase

Here step to class C

Here step to class SuperBase

I'm trait B

---------CBA.show----

Here step to trait A

Here step to trait B

Here step to trait TraitBase

Here step to class C

Here step to class SuperBase

I'm trait A

---------CBa.show----

Here step to trait AChild

Here step to trait A

Here step to trait B

Here step to trait TraitBase

Here step to class C

Here step to class SuperBase

I'm trait AChild

---------Cab.show----

Here step to trait BChild

Here step to trait B

Here step to trait AChild

Here step to trait A

Here step to trait TraitBase

Here step to class C

Here step to class SuperBase

I'm trait BChild

---------Ca.show----

Here step to trait AChild

Here step to trait A

Here step to trait TraitBase

Here step to class C

Here step to class SuperBase

I'm trait AChild

仔细分析这段代码与输出结果,你就能明了Trait的super调用是如何线性化的。

已CBa.show为例:

println("---------CBa.show----")       //小写的a代表AChild

new C with B with AChild show()  //这里等同于(new C with B with AChild).show()

调用过程从右到左并依次调用其基类的过程为:

Here step to trait AChild

Here step to trait A

Here step to trait TraitBase

Here step to class SuperBase

Here step to trait B

Here step to trait TraitBase

Here step to class SuperBase

Here step to class C

Here step to class SuperBase

按照【1.基类调用只出现一次;2.后面出现的基类调用在前面删除】原则处理如下:

Here step to trait AChild

Here step to trait A

Here step to trait TraitBase

Here step to class SuperBase

Here step to trait B

Here step to trait TraitBase

Here step to class SuperBase

Here step to class C

Here step to class SuperBase

最终得到:

Here step to trait AChild

Here step to trait A

Here step to trait B

Here step to trait TraitBase

Here step to class C

Here step to class SuperBase

相关文章

  • Scala Trait 的线性化

    Scala Trait调用super方法的线性化是一个难理解的内容,下面让我通过一段代码来推演线性化过程。 源代码...

  • trait in scala

    大多数情况下, Scala 中的 trait 相当于 Java 中的借口, 或者 Perl 6 中的 Role。S...

  • scala学习 - 特质

    本文来自《Programming in Scala》一书 Scala学习之特质(trait) 1 特质的定义 特质...

  • scala的Trait

    Trait基础 scala 中的Trait和Java中的接口(interface)极其类似 接口是彻底的抽象类,所...

  • Scala的trait

    今天看一下scala的trait,用法不讲,就看一下编译再反编译的源码定义一个trait 使用javac命令编译这...

  • Spark Sql 源码剖析(二): TreeNode

    零、前置知识 Scala Product trait 一、CurrentOrigin 使用 object Curr...

  • trait

    在scala中,trait相当于java中的interface关键字,可以用来定义接口,但是trait除了定义接口...

  • scala(十二) 特质

    特质的定义 Scala语言中,采用特质(trait)来代替接口的概念,也就是说,多个类具有相同的特质(trait)...

  • Scala特征(Trait)

    Scala Trait(特征) 相当于 Java 的接口,实际上它比接口还功能强大。与接口不同的是,它还可以定义属...

  • Scala详解——Trait

    学习过Java的同学肯定知道Java中有接口(interface)的概念,它在JAVA编程语言中是一个抽象类型,是...

网友评论

      本文标题:Scala Trait 的线性化

      本文链接:https://www.haomeiwen.com/subject/grzbbftx.html