解决钻石问题
该钻石的问题 ,或多重继承,由 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 - >任意