Traits and Composition
Composition
Build behavior by holding another object.
composition-helper
Composition means an object holds another object and delegates work to it. This reuses behavior without inheritance.
Composition
CompositionHelper.scala
Replay: real traced execution (multi-file project)
class Engine(power: Int) {
def boost: Int = power + 10
override def toString: String = "[engine]"
}
class Car(val engine: Engine) {
def totalPower: Int = engine.boost
override def toString: String = "[car]"
}
object Main {
def main(args: Array[String]): Unit = {
val power = 90
val car = new Car(new Engine(power))
println("power=" + power)
println("totalPower=" + car.totalPower)
}
}
class Engine(power: Int) {
def boost: Int = power + 10
override def toString: String = "[engine]"
}
class Car(val engine: Engine) {
def totalPower: Int = engine.boost
override def toString: String = "[car]"
}
object Main {
def main(args: Array[String]): Unit = {
val power = 60
val car = new Car(new Engine(power))
println("power=" + power)
println("totalPower=" + car.totalPower)
}
}
class Engine(power: Int) {
def boost: Int = power + 10
override def toString: String = "[engine]"
}
class Car(val engine: Engine) {
def totalPower: Int = engine.boost
override def toString: String = "[car]"
}
object Main {
def main(args: Array[String]): Unit = {
val power = 120
val car = new Car(new Engine(power))
println("power=" + power)
println("totalPower=" + car.totalPower)
}
}
power ← 90, car ← [car]
11object Main {12 def main(args: Array[String]): Unit = {13 val power→ 90 = 90 //@power=60, 12014 val car→ [car] = new Car(new Engine(power90))1516 println("power=" + power90)17 println("totalPower=" + car.totalPower100)18 }19}outputpower=90 totalPower=100
power ← 60, car ← [car]
11object Main {12 def main(args: Array[String]): Unit = {13 val power→ 60 = 6014 val car→ [car] = new Car(new Engine(power60))1516 println("power=" + power60)17 println("totalPower=" + car.totalPower70)18 }19}outputpower=60 totalPower=70
power ← 120, car ← [car]
11object Main {12 def main(args: Array[String]): Unit = {13 val power→ 120 = 12014 val car→ [car] = new Car(new Engine(power120))1516 println("power=" + power120)17 println("totalPower=" + car.totalPower130)18 }19}outputpower=120 totalPower=130