解決鑽石問題

鑽石的問題 ,或多重繼承,由 Scala 使用特徵,這是類似 Java 的介面處理。特徵比介面更靈活,可以包括實現的方法。這使得特徵與其他語言中的 mixin類似。

Scala 不支援從多個類繼承,但使用者可以在單個類中擴充套件多個特徵:

trait traitA {
  def name = println("This is the 'grandparent' trait.")
}

trait traitB extends traitA {
  override def name = {
    println("B is a child of A.")
    super.name
  }

}

trait traitC extends traitA {
  override def name = {
    println("C is a child of A.")
    super.name
  }
}

object grandChild extends traitB with traitC

grandChild.name

這裡 grandChild 繼承自 traitBtraitC,而 traitBtraitC 都繼承自 traitA。輸出(下面)還顯示了在解析首先呼叫哪些方法實現時的優先順序:

C is a child of A. 
B is a child of A. 
This is the 'grandparent' trait.

注意,當 super 用於呼叫 classtrait 中的方法時,線性化規則起作用來決定呼叫層次結構。grandChild 的線性化順序為:

grandChild - > traitC - > traitB - > traitA - > AnyRef - > Any

以下是另一個例子:

trait Printer {
  def print(msg : String) = println (msg)
}

trait DelimitWithHyphen extends Printer {
  override def print(msg : String) {
    println("-------------")
    super.print(msg)
  }
}

trait DelimitWithStar extends Printer  {
  override def print(msg : String) {
    println("*************")
    super.print(msg)
  }
}

class CustomPrinter extends Printer with DelimitWithHyphen with DelimitWithStar

object TestPrinter{
  def main(args: Array[String]) {
    new CustomPrinter().print("Hello World!")
  }
}

該程式列印:

*************Hello World!

CustomPrinter 的線性化將是:

CustomPrinter - > DelimitWithStar - > DelimitWithHyphen - >印表機 - > AnyRef - >任意