[Kotlin 小撇步 #2] 委任 (Delegation)

Andy Lu
Apr 9, 2021

--

Photo by Toa Heftiba on Unsplash

我們在對 val 變數進行延遲初始化時,使用 by lazyval 初始化的動作移到需要該變數的時候執行。

其中 by 這個關鍵字,代表的就是委任。

委任 (Delegation)

什麼是委任?白話一點的解釋,就是在某個類別所需要的功能可以交由其他的類別來處理。

假設有一個介面為 Uploader,它定義一個函式 upload

LogUploader 的類別繼承了這個介面,並且實作了這個函式

另一個 ImageUploader 的類別也繼承了這個介面,也同樣實作了這個函式:

當我們需要做上傳 Log 的時候,我們就會使用 LogUploader 類;
而當我們需要上傳 Image 的時候,我們就會使用 ImageUploader 類。

有一個 BackgroundService 類,我們可以將 Uploader 作為參數傳入,

依據傳入的具象類不同,我們所呼叫的 upload(any) 也會有不同的效果。

  • 可以看到,在 BackgroundServiceupload(any) 只是單純地將由外面傳入的具象化 Uploader 直接呼叫其 upload(any) ,本身自己沒有做任何事。
  • 自己不做任何事,委託外部的類別來完成,這個動作就叫做委託。

好的,講了那麼多,還是沒有提到 by 的用法啊?

by

下面的 BackgroundService2 同樣也是使用委任的概念,跟前面不同的是使用了 by 關鍵字。

可以發現,用 by 之後,整個程式碼都不用寫了,清爽許多。

我們來測試看看是不是真的有達到替換的效果。

兩種寫法的結果都是一樣的 👍

結論

為什麼要使用委任呢?可以讓類別的使用增加彈性,如上方的範例,我們傳入 Uploader 這個介面,目的是希望 BackgroundService 可以成為一個通用的類別,只要是實作 Uploader 介面的類別都可以傳進來。

利用 Kotlin 所提供的 by 關鍵字,可以讓我們更輕鬆的完成委任的動作。

如果你覺得本篇文章寫的不錯,

請拍手👏鼓勵我~

拍手小秘訣,按著不放可以連續拍喔😊

--

--

Andy Lu
Andy Lu

Written by Andy Lu

Android/Flutter developer, Kotlin Expert, like to learn and share.

No responses yet