デリゲート

kotlinlang.org

Delegation

Kotlinは、特定のインターフェースの処理を指定したインスタンスに自動的に委譲させることができる。

例: Baseインターフェースの処理をBaseImplインスタンスに移譲するDerivedクラス

interface Base {
    print()
}

class BaseImple : Base {
    override fun print() { print(x) }
}

// Base処理はインスタンスbに移譲する
class Derived(b: BaseImpl) : Base by b

fun main() {
    val b = BaseImpl(10)
    Derived(b).print() // 10
}

オーバーライドの動作について

  • メソッド: デリゲート元が呼び出される
  • プロパティ: 呼び出したインスタンスに依存する
interface Base {
    val message: String
    fun print()
    fun printMessageLine()
}
class BaseImpl(val x: Int) : Base {
    override val message = "BaseImpl: x = $x"
    override fun print() { println(message) }

    override fun printMessage() { print(x) }
}
class Derived(b: Base) : Base by b {
    // bからはアクセスされない
    override val message = "Message of Derived"

    // オーバーライドメソッドが呼び出される
    override fun printMessage() { print("abc") }
}

val b = BaseImpl(10)
Derived(b).print() // x = 10
Derived(b).printMessage() // "abc"

関連

yossan.hatenablog.com