こちらの「サンプルコード7」がビルドエラーになったので
エラー解消後のコードを載せておく
interfaceが足りていなかった。
Robotの引数もinterface
https://jp-seemore.com/app/14661/#toc2
class Robot(soundBehavior: SoundBehavior, lightBehavior: LightBehavior) : SoundBehavior by soundBehavior,
LightBehavior by lightBehavior
interface SoundBehavior {
fun makeSound()
}
interface LightBehavior {
fun illuminate()
}
class Sound : SoundBehavior {
override fun makeSound() {
println("音を鳴らす!")
}
}
class Light : LightBehavior {
override fun illuminate() {
println("光を放つ!")
}
}
val robot = Robot(Sound(), Light())
robot.makeSound() // SoundBehaviorのmakeSound()を呼び出す
robot.illuminate() // LightBehaviorのilluminate()を呼び出す
こういう風に引数をinterfaceにしていないと意味内容に思いますよね。
例えば別のLigthがあった場合にそれを引数にとれないのは拡張性がなさそう。
class Robot(soundBehavior: SoundBehavior, lightBehavior: LightBehavior) : SoundBehavior by soundBehavior,
LightBehavior by lightBehavior
class DownLight : LightBehavior {
override fun illuminate() {
println("下向きに光を放つ!")
}
}
val robot = Robot(Sound(), DownLight())