解決鑽石問題
該鑽石的問題 ,或多重繼承,由 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
繼承自 traitB
和 traitC
,而 traitB
和 traitC
都繼承自 traitA
。輸出(下面)還顯示了在解析首先呼叫哪些方法實現時的優先順序:
C is a child of A.
B is a child of A.
This is the 'grandparent' trait.
注意,當 super
用於呼叫 class
或 trait
中的方法時,線性化規則起作用來決定呼叫層次結構。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 - >任意