Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
package com.baeldung.scala.stackabletrait

object DecoratorExample {
trait IntTransformation {
def transform(value: Int): Int = value
}

class TransformationDecorator(wrappee: IntTransformation)
extends IntTransformation {
override def transform(value: Int): Int = wrappee.transform(value)
}

class DoubleDecorator(wrappee: IntTransformation)
extends TransformationDecorator(wrappee) {
override def transform(value: Int): Int =
super.transform(value * 2)
}

class LogInt(wrappee: IntTransformation)
extends TransformationDecorator(wrappee) {
override def transform(value: Int): Int = {
println(s"Transforming value: $value")
super.transform(value)
}
}

class CustomDecorator(f: Int => Int, wrappee: IntTransformation)
extends TransformationDecorator(wrappee) {
override def transform(value: Int): Int =
super.transform(f(value))
}

@main
def mainDec(): Unit = {
val identity = new IntTransformation {}

val withLogging = new LogInt(identity)
val withDouble = new DoubleDecorator(withLogging)
val withCustom = new CustomDecorator(_ + 1, withDouble)

println(s"With increment, double, and logging: ${withCustom.transform(5)}")
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package com.baeldung.scala.stackabletrait

object MixinExample {
trait Person {
val name: String
val country: String
}

case class ItalianPerson(name: String) extends Person {
val country = "Italy"
}

trait WithPrettyPrinting extends Person {
def prettyPrint: String =
s"""Name: $name
|Country: $country""".stripMargin
}

@main
def main(): Unit =
val italian = new ItalianPerson("Mario") with WithPrettyPrinting
println(italian)
println(italian.prettyPrint)
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
package com.baeldung.scala.stackabletrait

object StackableTraitExample {
trait IntTransformation {
def transform(value: Int): Int = value
}

trait DoubleTransformation extends IntTransformation {
override def transform(value: Int): Int =
super.transform(value * 2)
}

trait LogInt extends IntTransformation {
override def transform(value: Int): Int = {
println(s"Transforming value: $value")
super.transform(value)
}
}

trait CustomTransformation(f: Int => Int) extends IntTransformation {
override def transform(value: Int): Int =
super.transform(f(value))
}

@main
def mainST(): Unit = {
val logAndDouble = new IntTransformation
with DoubleTransformation
with LogInt {}
val doubleAndLog = new IntTransformation
with LogInt
with DoubleTransformation {}
val logAndCustom = new IntTransformation
with CustomTransformation(_ + 1)
with LogInt {}

println(s"Log and double: ${logAndDouble.transform(5)}")
println(s"Double and log: ${doubleAndLog.transform(5)}")
println(s"Log and increment: ${logAndCustom.transform(5)}")
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
package com.baeldung.scala.stackabletrait

object StackableTraitWithExplicitBaseAndCoreExample {
trait BaseIntTransformation {
def transform(value: Int): Int
}

trait CoreIntTransformation extends BaseIntTransformation {
def transform(value: Int): Int = value
}

trait DoubleTransformation extends CoreIntTransformation {
override def transform(value: Int): Int =
super.transform(value * 2)
}

trait LogInt extends CoreIntTransformation {
override def transform(value: Int): Int = {
println(s"Transforming value: $value")
super.transform(value)
}
}

trait CustomTransformation(f: Int => Int) extends CoreIntTransformation {
override def transform(value: Int): Int =
super.transform(f(value))
}

@main
def mainSTE(): Unit = {
val logAndDouble = new CoreIntTransformation
with DoubleTransformation
with LogInt {}
val doubleAndLog = new CoreIntTransformation
with LogInt
with DoubleTransformation {}
val logAndCustom = new CoreIntTransformation
with CustomTransformation(_ + 1)
with LogInt {}

println(s"Log and double: ${logAndDouble.transform(5)}")
println(s"Double and log: ${doubleAndLog.transform(5)}")
println(s"Log and increment: ${logAndCustom.transform(5)}")
}
}