Scala trait 線性推導

代碼

class A{ def m(s:String) = println(s"A($s)") } trait B extends A{ override def m(s:String) = super.m(s"B($s)") } trait C extends A{ override def m(s:String) = super.m(s"C($s)") } trait D extends A{ override def m(s:String) = super.m(s"D($s)") } trait E extends C{ override def m(s:String) = super.m(s"E($s)") } trait F extends C{ override def m(s:String) = super.m(s"F($s)") } class G extends D with E with F with B{ override def m(s:String) = super.m(s"G($s)") } val x = new G x.m("")

 

類圖

class

第一種推導方式

  1. 從右往左,選擇離G最遠的trait,將該tiait從自身到父類從左往右放置
  2. 將此時線性化的結果中重複值去掉,原則是多個元素保留最右
  3. 在最右加入AnyRef和Any,完成構建
step 結果
1 G B A
2 G B A F C A
3 G B A F C A E C A
4 G B A F C A E C A D A
5 G B F C E C D A
6 G B F E C D A
7 G B F E C D A AnyRef Any

因此輸出應該是:css

A(D(C(E(F(B(G()))))))ide

 

第二種推導方式

  1. 從左往右,選擇離G的trait最近的進行放置在左邊,他的父類放在右邊
  2. 依次將剩下的trait的也從左邊開始放置,若是其父類已經出如今右邊,則跳過
  3. 在最右加入AnyRef和Any,完成構建
step 結果
1 G D A
2 G E C D A
3 G F E C D A
4 G B F E C D A
5 G B F E C D A AnyRef Any

因此輸出應該是:spa

A(D(C(E(F(B(G()))))))
相關文章
相關標籤/搜索