Share behavior through a trait with a default method.

trait-contract A trait defines shared behavior. A class that extends the trait gains its methods without repeating the code.

Trait Contracts

name
TraitContract.scala
Replay: real traced execution (multi-file project)
trait Greeter {
  def greeting: String = "hello"
}

class English extends Greeter {
  override def toString: String = "[english]"
}

object Main {
  def main(args: Array[String]): Unit = {
    val name = "Ann"
    val speaker = new English()
    val message = speaker.greeting + ", " + name

    println("greeting=" + speaker.greeting)
    println("message=" + message)
  }
}
trait Greeter {
  def greeting: String = "hello"
}

class English extends Greeter {
  override def toString: String = "[english]"
}

object Main {
  def main(args: Array[String]): Unit = {
    val name = "Bea"
    val speaker = new English()
    val message = speaker.greeting + ", " + name

    println("greeting=" + speaker.greeting)
    println("message=" + message)
  }
}
trait Greeter {
  def greeting: String = "hello"
}

class English extends Greeter {
  override def toString: String = "[english]"
}

object Main {
  def main(args: Array[String]): Unit = {
    val name = "Cy"
    val speaker = new English()
    val message = speaker.greeting + ", " + name

    println("greeting=" + speaker.greeting)
    println("message=" + message)
  }
}
  1. name ← Ann, speaker ← [english], message ← hello, Ann

    9object Main {10  def main(args: Array[String]): Unit = {11    val name→ Ann = "Ann" //@name="Bea", "Cy"12    val speaker→ [english] = new English()13    val message→ hello, Ann = speaker[english].greeting + ", " + nameAnn1415    println("greeting=" + speaker.greetinghello)16    println("message=" + messagehello, Ann)17  }18}
    outputgreeting=hello
    message=hello, Ann
  1. name ← Bea, speaker ← [english], message ← hello, Bea

    9object Main {10  def main(args: Array[String]): Unit = {11    val name→ Bea = "Bea"12    val speaker→ [english] = new English()13    val message→ hello, Bea = speaker[english].greeting + ", " + nameBea1415    println("greeting=" + speaker.greetinghello)16    println("message=" + messagehello, Bea)17  }18}
    outputgreeting=hello
    message=hello, Bea
  1. name ← Cy, speaker ← [english], message ← hello, Cy

    9object Main {10  def main(args: Array[String]): Unit = {11    val name→ Cy = "Cy"12    val speaker→ [english] = new English()13    val message→ hello, Cy = speaker[english].greeting + ", " + nameCy1415    println("greeting=" + speaker.greetinghello)16    println("message=" + messagehello, Cy)17  }18}
    outputgreeting=hello
    message=hello, Cy