4 August 2022

Scala线性化算法


layout: post title: “scala 类的线性化算法” date: 2022-08-04 08:25:10 +0800 categories: note tags: scala —

类的线性化

  class Q{print("->Q")}
  trait W extends Q{print("->W")}
  trait E extends W{print("->E")}
  trait Z extends Q{print("->Z")}
  
    new Q with Z with E with W
    
	// 线性化从先是自身然后将继承混入的类由远及近的线性化
	// 重复的类选择最右边出现的(只会构造一次)
	// 线性化顺序就是构造顺序的倒序
	// L(Q)=Q<<L(W)<<L(E)<<L(Z)
	// L(Q)=Q<<L(W<<Q)<<L(E<<Q<<W)<<L(Z<<Q)
	//  线性化结果 :E<W<Z<Q
// 也可以理解为 类的初始化从自身开始初始化,然后从rightmost 开始压栈,重复的类已经定义过就不需要再压栈了
trait H { print("->H")}
trait S extends H {print("->S")}
trait R {print("->R")}
trait T extends R with H {print("->T")}
class B extends A with T with S {print("->B")}
// L(B)=B>>L(S)>L(T)>L(A)
// L(B)=B>>L(S>>H)>>L(T>>H>>R)>>L(A>>X)
//L(B)=B,S,T,H,R,A,X
   new B 

scala structual Type

``` type javaClosae=java.util.Closeable

trait mineCloseAble{ def close():Unit }

type CanClose={ def close():Unit }

object Test{ // 可以接受各种类型的close def closeScilent(c:CanClose):c.close def main(args:String*)={

} }