《Programming in scala,3rd Edition》chapter12.6后,尝试自己绘制了下linearization
书本示例中除了最后的Cat的申明用了with,其他的trait/class都只有extends,即单一继承。
这里构造了相对复杂的情况来说明linearization是怎样的。
分析过程(省略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,进行验证
输出为
书本示例中除了最后的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