Skip to content

Instantly share code, notes, and snippets.

@frgomes
Last active June 29, 2016 06:42
Show Gist options
  • Save frgomes/a9bc336f7b4fe7205d47 to your computer and use it in GitHub Desktop.
Save frgomes/a9bc336f7b4fe7205d47 to your computer and use it in GitHub Desktop.
Scala - Chaining traits
trait Irrelevant {}
trait Base {
def text: String = "Base"
def enter: () => Any =
() => {
println("enter: Some logic")
}
def embed: () => Any =
() => {
println("embed: Some logic")
}
def leave: () => Any =
() => {
println("leave: Some logic")
}
}
trait A extends Irrelevant with Base {
override def text: String = "A extends " + super.text
override def enter: () => Any =
() => {
super.enter()
println("enter: Some logic added by A")
}
override def embed: () => Any =
() => {
println("embed: A before")
super.embed()
println("embed: A after")
}
override def leave: () => Any =
() => {
println("leave: Some logic added by A")
super.leave()
}
}
trait B extends Irrelevant with Base {
override def text: String = "B extends " + super.text
override def enter: () => Any =
() => {
super.enter()
println("enter: Some logic added by B")
}
override def embed: () => Any =
() => {
println("embed: B before")
super.embed()
println("embed: B after")
}
override def leave: () => Any =
() => {
println("leave: Some logic added by B")
super.leave()
}
}
class TestCase extends Irrelevant with Base with A with B {
println("========================================")
println(text)
println("----------------------------------------")
enter()
println("----------------------------------------")
embed()
println("----------------------------------------")
leave()
println("========================================")
}
object Main {
def main(args: Array[String]): Unit = {
new TestCase
}
}
// prints:
//
// ========================================
// B extends A extends Base
// ----------------------------------------
// enter: Some logic
// enter: Some logic added by A
// enter: Some logic added by B
// ----------------------------------------
// embed: B before
// embed: A before
// embed: Some logic
// embed: A after
// embed: B after
// ----------------------------------------
// leave: Some logic added by B
// leave: Some logic added by A
// leave: Some logic
// ========================================
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment