推荐答案
在 Kotlin 中,委托(Delegation)是一种设计模式,允许一个对象将某些操作或属性的实现委托给另一个对象。Kotlin 通过 by 关键字支持类委托和属性委托。
类委托
类委托允许一个类将其部分或全部功能委托给另一个类的实例。通过这种方式,可以实现代码复用和接口的实现。
// www.javascriptcn.com code example
interface Base {
fun print()
}
class BaseImpl(val x: Int) : Base {
override fun print() { print(x) }
}
class Derived(b: Base) : Base by b
fun main() {
val b = BaseImpl(10)
Derived(b).print() // 输出: 10
}属性委托
属性委托允许将属性的 getter 和 setter 方法委托给另一个对象。Kotlin 标准库中提供了 lazy、observable 等常用的委托属性。
// www.javascriptcn.com code example
import kotlin.properties.Delegates
class User {
var name: String by Delegates.observable("<no name>") {
_, old, new -> println("Name changed from $old to $new")
}
}
fun main() {
val user = User()
user.name = "Alice" // 输出: Name changed from <no name> to Alice
user.name = "Bob" // 输出: Name changed from Alice to Bob
}本题详细解读
类委托
类委托的核心思想是通过组合而不是继承来实现代码复用。在 Kotlin 中,使用 by 关键字可以将一个类的接口实现委托给另一个类的实例。这种方式可以避免继承带来的复杂性,同时保持代码的简洁和可维护性。
在上面的例子中,Derived 类将 Base 接口的实现委托给了 BaseImpl 类的实例 b。因此,Derived 类可以直接调用 b 的 print 方法。
属性委托
属性委托允许将属性的访问逻辑委托给另一个对象。Kotlin 标准库提供了多种内置的委托属性,如 lazy、observable、vetoable 等。
lazy:延迟初始化属性,只有在第一次访问时才会计算值。observable:在属性值发生变化时触发回调。vetoable:在属性值发生变化前进行验证,可以阻止无效的赋值。
在上面的例子中,User 类的 name 属性使用了 observable 委托,当 name 的值发生变化时,会自动触发回调函数并输出变化信息。
通过委托,Kotlin 提供了一种灵活且强大的方式来管理类的行为和属性的访问逻辑,使得代码更加模块化和可维护。