類委託
屬性委託 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...