具有特征的可堆叠修改

你可以使用特征来以可堆叠的方式使用特征来修改类的方法。

以下示例显示了如何堆叠特征。特征的排序很重要。使用不同的特征顺序,实现不同的行为。

class Ball {
  def roll(ball : String) = println("Rolling : " + ball)
}

trait Red extends Ball {
  override def roll(ball : String) = super.roll("Red-" + ball)
}

trait Green extends Ball {
  override def roll(ball : String) = super.roll("Green-" + ball)
}

trait Shiny extends Ball {
  override def roll(ball : String) = super.roll("Shiny-" + ball)
}

object Balls {
  def main(args: Array[String]) {
    val ball1 = new Ball with Shiny with Red
    ball1.roll("Ball-1") // Rolling : Shiny-Red-Ball-1

    val ball2 = new Ball with Green with Shiny
    ball2.roll("Ball-2") // Rolling : Green-Shiny-Ball-2
  }
}

请注意,super 用于在两个特征中调用 roll() 方法。只有这样我们才能实现可堆叠的修改。在可堆叠修改的情况下,方法调用顺序由 线性化规则 确定。