Traits and Composition
Trait Contracts
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
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)
}
}
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
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
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