Kotlin 的委托(Delegation) 是一种设计模式的语言级实现,核心思想是将一个类的部分功能委托给另一个类来完成,避免继承的耦合性,同时复用代码。Kotlin 提供了 by 关键字,让委托的实现变得简洁且优雅。
委托分为两种核心类型:
- 类委托(Class Delegation) :实现接口时,将接口的方法委托给另一个对象。
- 属性委托(Property Delegation) :将属性的
get/set逻辑委托给另一个对象。
一、类委托
//定义委托接口
interface Printer{
fun print()
fun change()
}
//定义一个非委托类,用于实现和委托类的对比,非委托类必须实现接口中的所有方法
class myPrinter:Printer{
override fun print() {
println("开始打印")
}
override fun change() {
println("开始换墨盒")
}
}
//委托类的实现:必须有一个委托参数,类型为委托的接口类型,然后使用by关键字将接口委托给参数。
//委托类中可以不用实现所有方法,只对需要的方法进行修改即可,这样可以节约资源,提升效率
class hisPrinter(you:Printer):Printer by you{
override fun print() {
println("这是委托打印")
}
}
//main方法中实现委托的输出
fun main() {
var p = myPrinter()
hisPrinter(p).print()
}
二、属性委托
val lazyValue: String by lazy {
println("第一次访问时初始化")
"Hello Lazy"
}
fun main() {
println(lazyValue) // 第一次访问:初始化 + 输出值
println(lazyValue) // 直接输出值,不再初始化
}