解决钻石问题

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