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

power
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)
  }
}
  1. 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
  1. 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
  1. 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