Skip to content

Commit

Permalink
Merge pull request #1456 from mdipirro/scala-601-stackable-trait
Browse files Browse the repository at this point in the history
SCALA-601 Add code for stackable trait article
  • Loading branch information
dominiqueplante authored Sep 20, 2024
2 parents 2ff7d51 + 8398deb commit a7b5c7a
Show file tree
Hide file tree
Showing 4 changed files with 153 additions and 0 deletions.
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)}")
}
}

0 comments on commit a7b5c7a

Please sign in to comment.