Android kotlin 詳解(4)

最近,有很多盆友問我:“委託怎麼玩?”。所以這邊博客,我們就來講講委託。

在開講之前,我先講講我的學習心得。其實,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()函數獲得記錄結果,打印出來。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章