最近,有很多盆友问我:“委托怎么玩?”。所以这边博客,我们就来讲讲委托。
在开讲之前,我先讲讲我的学习心得。其实,IT行业的许多术语都来自生活,比如:“委托”。什么叫做委托,就是自己不做交给别人做呗。那反应到编程当中,其实也是这样。个人觉得编程学的越久,越会觉得:“学的就是一种思维,一种模式,以及返璞归真学基础”。
废话不多说了,我们继续来看博客。
一.类委托
看名字就知道了,就是委托给一个类,再说通俗点,就是你可以用这个委托类中的公共函数.
看例子:
interface BaseKotlin {
fun printInfo(x :String) {};
fun allInfo(x :String) {};
}
----------------------------------------
class BaseImpl:BaseKotlin {
override fun printInfo(x:String){
println("========== $x")
}
fun myFavorite(){
println("===我的爱好是=== wash one's feet")
}
}
-----------------------------------------
//将 b 保存在 DeviceImpl的对象实例内部,而且编译器将会生成继承自 BaseKotlin接口的所有方法, 并将调用转发给 b。
class DeviceImpl(var b: BaseKotlin) : BaseKotlin by b{
fun disPlay(){
println("===========jimTrency")
b.allInfo("jimTrency");
}
}
下面就是调用了:
var baseImpl=BaseImpl();
var deviceImpl=DeviceImpl(baseImpl);
//通过委托,调用的是baseImpl.printInfo()
deviceImpl.printInfo("28-30");
//调用的是自己的disPlay()函数
deviceImpl.disPlay();
//deviceImpl.myFavorite() //不能调用,是委托给BaseKotlin的对象,而不是BaseImpl
二.属性委托
属性委托指的是一个类的某个属性值不是在类中直接进行定义,而是将其托付给一个代理类,从而实现对该类的属性统一管理。
属性委托语法格式:
val/var <属性名>: <类型> by <表达式>
by 关键字之后的表达式就是委托, 属性的 get() 方法(以及set() 方法)将被委托给这个对象的 getValue() 和 setValue() 方法。属性委托不必实现任何接口, 但必须提供 getValue() 函数(对于 var属性,还需要 setValue() 函数)。
例子如下:
输出结果为:
三.标准委托
lazy() 是一个函数, 接受一个 Lambda 表达式作为参数, 返回一个 Lazy 实例的函数,返回的实例可以作为实现延迟属性的委托: 第一次调用 get() 会执行已传递给 lazy() 的 lamda 表达式并记录结果(表达式的最后一句,最为记录结果), 后续调用 get() 只是返回记录的结果。
上面的输出结果为什么是这样呢?为什么第一次执行,执行两次输出表达式?
其实上面已经说了原因的,只是估计好多人看起来都蒙圈。第一次执行 println(lazyValue)时,先会执行lamda 表达式,结果就会打印出:“computed!”,而“Hello”做为表达式的最后一句,就会成为记录结果,接着在执行get()函数获得记录结果,打印出来。