Kotlin基礎 委託

2021-09-11 15:05:04 字數 4123 閱讀 6186

類委託

屬性委託 2.1. 方法一:可以按需繼承readonlyproperty、readwriteproperty兩個介面中的乙個; 2.2. 方法二:自己定義,但方法引數必須和 1 中介面的方法引數一致;

標準委託 3.1. 延遲屬性 lazy 3.2. 可觀察屬性 observable 3.3. 把屬性儲存在對映中

使用場景

delegation pattern

類的兩種**方法

inte***ce

base

class

baseimpl

(val x: int) : base

}// 第一種:這裡直接使用關鍵字 by 進行**

class

derived

(base: base) : base by base

// 第二種:

class

derived

(base: base) : base

override

funprint()

}// 測試

class

main

}複製**

語法結構:val/var : by

兩種實現方法:

方法一:可以按需繼承readonlyproperty、readwriteproperty兩個介面中的乙個;

// 讀取屬性

public

inte***ce

readonlyproperty

// 讀寫屬性

public

inte***ce

readwriteproperty

複製**

示例**:

class

delegate

: readwriteproperty

override

funsetvalue

(thisref: any?, property: kproperty

<*>, value: t)

}class

main

}複製**

方法二:自己定義,但方法引數必須和 1 中介面的方法引數一致;

class

delegate

' to me!"

}operator

funsetvalue

(thisref: any?, property: kproperty

<*>, value: t)

' in $thisref.")

}}複製**

示例**:

class

main

}複製**

1. 延遲屬性 lazy

示例**:

val lazyvalue: string by lazy 

funmain

(args: array

)作用區間的**,即列印乙個"computed!",然後返回乙個"hello"字串並賦值給lazyvalue;

println(lazyvalue) //第二次呼叫lazyvalue時,直接將"hello"賦值給lazyvalue;可參考下面的原始碼

}複製**

原始碼:lazy.kt檔案

public

funlazy

(initializer: ()

-> t): lazy= synchronizedlazyimpl(initializer)

private

object uninitialized_value

@jvmversion

private

class

synchronizedlazyimpl

(initializer: () -> t, lock: any? = null) : lazy, serializable

return synchronized(lock)

else }}

override

funisinitialized

(): boolean = _value !== uninitialized_value

override

funtostring

(): string = if (isinitialized()) value.tostring() else

"lazy value not initialized yet."

private

funwritereplace

(): any = initializedlazyimpl(value)

}複製**

2. 可觀察屬性 observable

示例**:

class

user

// 方法二:delegates.observable()實際上就是對observableproperty的一層封裝

var name : string by

object : observableproperty("")

}}fun

main()

複製**

輸出結果 < no name > -> first first -> second

原始碼:

public

inline

funobservable

(initialvalue: t, crossinline onchange: (property: kproperty

<*>, oldvalue: t, newvalue: t)

-> unit):

readwriteproperty= object : observableproperty(initialvalue)

public

inline

funvetoable

(initialvalue: t, crossinline onchange: (property: kproperty

<*>, oldvalue: t, newvalue: t)

-> boolean):

readwriteproperty= object : observableproperty(initialvalue)

public

abstract

class

observableproperty

(initialvalue: t) : readwriteproperty

// **後,自動被呼叫

public

override

fungetvalue

(thisref: any?, property: kproperty

<*>)

: t

// **後,自動被呼叫

public

override

funsetvalue

(thisref: any?, property: kproperty

<*>, value: t)

this.value = value

afterchange(property, oldvalue, value)

}}複製**

3. 把屬性儲存在對映中
這部分不知道怎麼看原始碼

class

user

(val map: map)

val user = user(mapof(

"name" to "john doe",

"age" to 25

))複製**

Kotlin學習 Kotlin委託

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

Kotlin系列八 委託

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

Kotlin學習之委託機制

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