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)
[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()
}

输出为

Cat
HasTongue
HasTeeth
HasMouth
FourLegged
HasLegs
Furry
Animal

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值