最近,有很多盆友問我:“委託怎麼玩?”。所以這邊博客,我們就來講講委託。
在開講之前,我先講講我的學習心得。其實,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()函數獲得記錄結果,打印出來。