Scala Language Modifica impilabile con tratti


Esempio

È possibile utilizzare i tratti per modificare i metodi di una classe, utilizzando i tratti in modo impilabile.

Il seguente esempio mostra come i tratti possono essere impilati. L'ordine dei tratti è importante. Usando un diverso ordine di tratti, si ottiene un comportamento diverso.

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
  }
}

Nota che super è usato per invocare roll() metodo roll() in entrambi i tratti. Solo in questo modo possiamo ottenere modifiche impilabili. In caso di modifica impilabile, l'ordine di invocazione del metodo è determinato dalla regola di linearizzazione .