8 5 Kotlin 委託詳解

2021-10-08 15:15:28 字數 2702 閱讀 2200

委託可能是什麼東東呢?kotlin中的委託可能不是太明白是啥意思,聯想下生活中委託,是不是請某個人幫助我們來完成任務啊。

那麼切入正題,kotlin中委託就是指,有兩個物件參與處理同乙個請求,接受請求的物件將請求委託給另乙個物件來處理。學過軟體設計模式的有沒有很熟悉,不就是**模式嗎?

屬性委託

標準委託

可觀察屬性 observable

把屬性儲存在對映中

kotlin 直接支援委託模式,更加優雅,簡潔。kotlin 通過關鍵字 by 實現委託。

類委託:本類需要實現的方法/屬性,借用其他已實現該方法/屬性的物件作為自己的實現;​ 一旦使用了某類作為委託類,該類就能借用該委託類實現的方法/屬性。

示例:

//定義乙個抽象介面,包含乙個屬性和方法

inte***ce animal

//建立乙個類接受託(被委託的類),實現animal介面的方法

class dog : animal

is $color")}

}

將被委託類作為構造器形參傳入(常用)
//通過關鍵字 by 建立委託類

class

dog1

(dog: animal)

: animal by dog

新建委託類物件
class dog2 : animal by

dog(

)

新建委託類物件,並自己實現方法/屬性
class dog3 : animal by

dog(

) 是 $color")}

}

執行示例:

fun

main()

結果:

by

.dog is 黃色

黃色by

.dog is 黃色

黃色by

.dog3 是 白色

白色

屬性委託:指的是乙個類的某個屬性值不是在類中直接進行定義,而是將其託付給乙個**類,從而實現對該類的屬性統一管理。

屬性委託語法格式:

val

/var

《屬性名》

:《型別》

by《表示式》

示例:該類需要包含 getvalue() 方法和 setvalue() 方法,且引數 dog為進行委託的類的物件,property為進行委託的屬性的物件。

//定義乙個dog類 屬性name委託pet類實現

class dog

/** * 定義乙個被委託的類pet,

* 為屬性name建立了operator修飾的getvalue和setvalue方法 ;

* 該屬性可被其他委託該類共享

* */

class pet

operator

funsetvalue

(dog: dog, property: kproperty<

*>

, value: string)

}fun

main()

結果:

大黃
kotlin 的標準庫中已經內建了很多任務廠方法來實現屬性的委託。

延遲屬性 lazy

lazy()是乙個函式, 接受乙個 lambda 表示式作為引數, 返回乙個 lazy 例項的函式,返回的例項可以作為實現延遲屬性的委託:第一次呼叫 get() 會執行已傳遞給 lazy() 的 lamda 表示式並記錄結果, 後續呼叫 get() 只是返回記錄的結果。

val lazyvalue: string by lazy 

funmain

(args: array

)

執行輸出結果:

computed!

hello

hello

observable 可以用於實現觀察者模式。

delegates.observable() 函式接受兩個引數: 第乙個是初始化值, 第二個是屬性值變化事件的響應器(handler)。

在屬性賦值後會執行事件的響應器(handler),它有三個引數:被賦值的屬性、舊值和新值:

import kotlin.properties.delegates

class user

}fun

main

(args: array

)

結果:

舊值:初始值 -> 新值:第一次賦值

舊值:第一次賦值 -> 新值:第二次賦值

乙個常見的用例是在乙個對映(map)裡儲存屬性的值。 這經常出現在像解析 json 或者做其他"動態"事情的應用中。 在這種情況下,你可以使用對映例項自身作為委託來實現委託屬性。

class

site

(map: mutablemap>

)fun

main()

結果:

Kotlin學習 Kotlin委託

委託模式是軟體設計模式中的一項基本技巧。在委託模式中,有兩個物件參與處理同乙個請求,接受請求的物件將請求委託給另乙個物件來處理。kotlin 直接支援委託模式,更加優雅,簡潔。kotlin 通過關鍵字 by 實現委託 類的委託即乙個類中定義的方法實際是呼叫另乙個類的物件的方法來實現的。以下例項中派生...

Kotlin基礎 委託

類委託 屬性委託 2.1.方法一 可以按需繼承readonlyproperty readwriteproperty兩個介面中的乙個 2.2.方法二 自己定義,但方法引數必須和 1 中介面的方法引數一致 標準委託 3.1.延遲屬性 lazy 3.2.可觀察屬性 observable 3.3.把屬性儲存...

Kotlin系列八 委託

委託模式已經證明是實現繼承的乙個很好的替代方式,而 kotlin 可以零樣板 地原生支援它。這是官方對委託的描述,可能比較抽象但當你了解其意義和使用,會發現委託所帶來的方便會讓你愛不釋手,下面我們來開始學習委託吧,首先看乙個官方的例子 inte ce base class baseimpl val ...