具有特徵的可堆疊修改

你可以使用特徵來以可堆疊的方式使用特徵來修改類的方法。

以下示例顯示瞭如何堆疊特徵。特徵的排序很重要。使用不同的特徵順序,實現不同的行為。

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() 方法。只有這樣我們才能實現可堆疊的修改。在可堆疊修改的情況下,方法呼叫順序由 線性化規則 確定。