Kotlin學習之委託機制

2021-07-11 03:20:54 字數 2491 閱讀 8317

委託模式可以很好的替代實現繼承,kotlin本身支援需要零樣板**,乙個類derived 可以繼承base並委託它所有的public 方法到乙個指定的類:

inte***ce base

class baseimpl(val x: int) : base

} class derived(b: base) : base by b

fun main()

這個在父類後面的by指定b儲存為derived的內部物件,編譯器會生成base的所有方法寄於到b上。

屬性的委託指的乙個類的某個屬性的值不是在類中直接進行定義,而是由某個類的方法來進行 setter 和 getter。預設屬性委託都是執行緒安全的。屬性委託適合那些屬性的需要複雜的計算但是計算過程可以被重用的場合。

定義乙個被委託的類

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

「` class delegate = $message from $thisref"

}operator fun setvalue(thisref: any?, prop: kproperty<*>, value: string) 定義包含屬性委託的類

class example

訪問該屬性

val e = example()

println(e.msg) // msg = default message

e.msg = "new message"

println(e.msg) // msg = new message

在使用屬性委託時,被委託的類的方法(即接收者)的返回值必須與委託的屬性相同或者其父類。

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

lazy

lazy 用於進行惰性載入,即第一次使用時才執行初始化的操作。

observable

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

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

delegates.observable 接收三個引數:包含委託的屬性的元資料的 kproperty 物件,舊值,新值。

class user 

}}

訪問該屬性
val user = user()

user.name = "first" // -> first

user.name = "first"

user.name = "second" // first -> second

也可以使用 vetoable 代替 observable,該方法擁有布林型別的返回值,返回 false 的話可以取消對該屬性的修改。

在以上 user 中定義乙個新屬性。

var age: int by delegates.vetoable(0)
訪問屬性:

user.age = 10   //  0 -> 10

println(user.age) // 10

user.age = 20 // 10 -> 20

println(user.age) // 20

notnull

notnull 適用於那些無法在初始化階段就確定屬性值的場合。

class foo foo.notnullbar = "bar"

println(foo.notnullbar)

需要注意,如果屬性在賦值前就被訪問的話則會丟擲異常。

以 map 形式儲存屬性的值

kotlin 中有一種特別的委託,可以以 map 作為乙個類的構造方法的引數,訪問該類的屬性就是訪問該 map 的鍵值對。這種做法非常類似 groovy 中的帶名構造方法。

要實現這一功能需要得意於 kotlin 內建的屬性的擴充套件方法 kotlin.properties.getvalue

例:

import kotlin.properties.getvalue

class person(val map: map)

可以像普通類一樣訪問其各個屬性:

val person = person(mapof(

"name" to "john",

"age" to 25

))println(person.name)

println(person.age)

對於可變值,可以使用 mutablemap 代替,並匯入擴充套件方法 kotlin.properties.setvalue。

import kotlin.properties.setvalue

class mutableperson(val map: mutablemap)

Kotlin學習 Kotlin委託

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

Kotlin學習指南之委託模式

5.參考 委託模式是軟體設計中一種常用也是比較重要的技巧。這種模式可以簡單理解為 模式。在委託模式中,有兩個物件參與處理同乙個請求,接受請求的物件將請求委託給另乙個物件來處理。kotlin 直接支援委託模式,更加優雅,簡潔。kotlin 通過關鍵字 by 實現委託。kotlin委託模式主要包含兩種型...

kotlin學習之類委託(八)

如果我們需要乙個集合類,含有mutablecollection的所有功能,並可以修改兩個方法,add和addall,那麼我們需要寫乙個新的類繼承mutablecollection,並把乙個mutablecollection成員放到裡面,覆蓋並修改他的所有方法,並修改add和addall方法。clas...