Kotlin學習指南之委託模式

2021-10-12 03:12:58 字數 2935 閱讀 4955

5. 參考

委託模式是軟體設計中一種常用也是比較重要的技巧。這種模式可以簡單理解為**模式。在委託模式中,有兩個物件參與處理同乙個請求,接受請求的物件將請求委託給另乙個物件來處理

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

kotlin委託模式主要包含兩種型別:類委託和屬性委託。

類的委託即乙個類中定義的方法實際是呼叫另乙個類的物件的方法來實現的。

下面是乙個類委託的簡單示例:

// 建立介面

inte***ce base

// 實現此介面的被委託的類

class

baseimpl

(val x: int)

: base

}// 通過關鍵字 by 建立委託類

class

derived

(b: base)

: base by b

funmain

(args: array

)

在 derived 宣告中,by 子句表示,將 b 儲存在 derived 的物件例項內部,而且編譯器將會生成繼承自 base 介面的所有方法, 並將呼叫**給 b。

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

屬性委託語法格式:

val/var 《屬性名》

:《型別》 by 《表示式》

by 關鍵字之後的表示式就是委託, 屬性的 get() 方法(以及set() 方法)將被委託給這個物件的 getvalue() 和 setvalue() 方法。屬性委託不必實現任何介面, 但必須提供 getvalue() 函式(對於 var屬性,還需要 setvalue() 函式)。

下面是乙個屬性委託的**示例:

import kotlin.reflect.kproperty

// 定義包含屬性委託的類

class example

// 委託的類

class delegate

屬性"}operator

funsetvalue

(thisref: any?

, property: kproperty<

*>

, value: string)

屬性賦值為 $value")}

}fun

main

(args: array

)

kotlin 標準庫為幾種有用的委託提供了工廠方法。

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

val lazyvalue: string by lazy 

funmain()

delegates.observable()接受兩個引數:初始值與修改時處理程式(handler)。 每當我們給屬性賦值時會呼叫該處理程式(在賦值後執行)。

import kotlin.properties.delegates

class user

}fun

main()

如果你想截獲賦值並「否決」它們,那麼使用vetoable()取代observable()。 在屬性被賦新值生效之前會呼叫傳遞給vetoable的處理程式。

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

class

user

(val map: map>

)fun

main()

這也適用於 var 屬性,如果把唯讀的 map 換成 mutablemap。

fun

example

(computefoo:()

-> foo)

}

memoizedfoo變數只會在第一次訪問時計算。 如果somecondition失敗,那麼該變數根本不會計算。

通過定義providedelegate操作符,可以擴充套件建立屬性實現所委託物件的邏輯。 如果by右側所使用的物件將providedelegate定義為成員或擴充套件函式,那麼會呼叫該函式來建立屬性委託例項。

如果要在繫結之前檢測屬性名稱,示例**如下:

class resourcedelegate

: readonlyproperty

}class resourceloader

(id: resourceid

)private

funcheckproperty

(thisref: myui, name: string)

}class myui

val image by

bindresource

(resourceid.image_id)

val text by

bindresource

(resourceid.text_id)

}

kotlin委託

Kotlin學習指南目錄索引

kotlin學習指南系列文章目錄索引 kotlin學習指南 基本語法 基本資料型別 條件及迴圈控制 kotlin學習指南 類和物件 kotlin學習指南 容器list map set詳解 kotlin學習指南 類和物件 kotlin學習指南 泛型 異常 kotlin學習指南之委託模式 kotlin學...

Kotlin學習 Kotlin委託

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

Kotlin學習之委託機制

委託模式可以很好的替代實現繼承,kotlin本身支援需要零樣板 乙個類derived 可以繼承base並委託它所有的public 方法到乙個指定的類 inte ce base class baseimpl val x int base class derived b base base by b f...