デリゲート
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"