Kotlin的by關(guān)鍵字怎么用

這篇“Kotlin的by關(guān)鍵字怎么用”文章的知識(shí)點(diǎn)大部分人都不太理解,所以小編給大家總結(jié)了以下內(nèi)容,內(nèi)容詳細(xì),步驟清晰,具有一定的借鑒價(jià)值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來(lái)看看這篇“Kotlin的by關(guān)鍵字怎么用”文章吧。

創(chuàng)新互聯(lián)建站專注于企業(yè)成都營(yíng)銷網(wǎng)站建設(shè)、網(wǎng)站重做改版、羅平網(wǎng)站定制設(shè)計(jì)、自適應(yīng)品牌網(wǎng)站建設(shè)、H5技術(shù)電子商務(wù)商城網(wǎng)站建設(shè)、集團(tuán)公司官網(wǎng)建設(shè)、外貿(mào)網(wǎng)站制作、高端網(wǎng)站制作、響應(yīng)式網(wǎng)頁(yè)設(shè)計(jì)等建站業(yè)務(wù),價(jià)格優(yōu)惠性價(jià)比高,為羅平等各大城市提供網(wǎng)站開(kāi)發(fā)制作服務(wù)。

委托模式已已經(jīng)證明是實(shí)現(xiàn)繼承的一個(gè)很好的替代方式

Kotlin 中 by 就是用于實(shí)現(xiàn)委托的。

fun main(args: Array<String>) {
    val b =BaseImpl("base")
    Derived(b).print()
 
}
interface  Base{
    fun print()
}
class BaseImpl(val x :String):Base{
    override fun print()  = print(x)
 
}
class  Derived(b: Base) :Base by b
Derived 的父類列表中的by子句 會(huì)將b 存儲(chǔ)Derived內(nèi)部,并且編譯器會(huì)生成所有b類型的方法

覆蓋由委托實(shí)現(xiàn)的接口成員
fun main(args: Array<String>) {
    val b =BaseImpl("base")
    val derived = Derived(b)
    derived.printLine()//base----base
    derived.printMessage()//Derived
    println(derived.message)//Derived----
 
}
interface  Base{
    val message :String
    fun printMessage()
    fun printLine()
}
class BaseImpl(val x :String):Base{
    override val message: String="base----$x"
 
    override fun printMessage() = print(x)
 
    override fun printLine() = println(message)
 
}
class  Derived(b: Base) :Base by b{
    override val message: String="Derived----"
    override fun printMessage() = print("Derived")
}
Derived 可以重寫方法,但是重寫的成員不會(huì)在委托對(duì)象的成員中調(diào)用

屬性委托
屬性委托的語(yǔ)法: val/var <屬性名>: <類型> by <表達(dá)式>

屬性委托不需要實(shí)現(xiàn)任何接口但是要重寫setValue 和 getValue 方法

 
class Delegate{
    operator fun getValue(thisRef: Any?, property: KProperty<*>): String {
        return "${thisRef?.javaClass}, thank you for delegating '${property.name}' to me!"
    }
 
    operator fun setValue(thisRef: Any?, property: KProperty<*>, value: String) {
        println("$value has been assigned to '${property.name}' in ${thisRef?.javaClass}.")
    }
}
 
 
fun main(args: Array<String>) {
    val example=Example()
    print(example.str)//class sample.xietaichen.koinsample.Example, thank you for delegating 'str' to me!
example.str="aaa"//aaa has been assigned to 'str' in sample.xietaichen.koinsample.Example@19469ea2.
}
class  Example{
    var str :String by Delegate()
}
當(dāng)我們從委托到一個(gè) Delegate實(shí)例的 str讀取時(shí),將調(diào)用Delegate中的 getValue() 函數(shù), 所以它第一個(gè)參數(shù)是讀出str的對(duì)象、第二個(gè)參數(shù)保存了對(duì)str自身的描述 (例如你可以取它的名字)。

setValue 同理

對(duì)于一個(gè)只讀屬性(即 val 聲明的),委托必須提供一個(gè)名為 getValue 的函數(shù),該函數(shù)接受以下參數(shù):

thisRef —— 必須與 屬性所有者 類型(對(duì)于擴(kuò)展屬性——指被擴(kuò)展的類型)相同或者是它的超類型;
property —— 必須是類型 KProperty<*> 或其超類型。
這個(gè)函數(shù)必須返回與屬性相同的類型(或其子類型)

對(duì)于一個(gè)可變屬性(即 var 聲明的),委托必須額外提供一個(gè)名為 setValue 的函數(shù),該函數(shù)接受以下參數(shù):

thisRef —— 同 getValue();
property —— 同 getValue();
new value —— 必須與屬性同類型或者是它的超類型。
getValue() 或/與 setValue() 函數(shù)可以通過(guò)委托類的成員函數(shù)提供或者由擴(kuò)展函數(shù)提供。 當(dāng)你需要委托屬性到原本未提供的這些函數(shù)的對(duì)象時(shí)后者會(huì)更便利。 兩函數(shù)都需要用 operator 關(guān)鍵字來(lái)進(jìn)行標(biāo)記。

委托類可以實(shí)現(xiàn)包含所需 operator 方法的 ReadOnlyProperty 或 ReadWriteProperty 接口之一

interface ReadOnlyProperty<in R, out T> {
    operator fun getValue(thisRef: R, property: KProperty<*>): T
}
 
interface ReadWriteProperty<in R, T> {
    operator fun getValue(thisRef: R, property: KProperty<*>): T
    operator fun setValue(thisRef: R, property: KProperty<*>, value: T)
}

以上就是關(guān)于“Kotlin的by關(guān)鍵字怎么用”這篇文章的內(nèi)容,相信大家都有了一定的了解,希望小編分享的內(nèi)容對(duì)大家有幫助,若想了解更多相關(guān)的知識(shí)內(nèi)容,請(qǐng)關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。

網(wǎng)頁(yè)題目:Kotlin的by關(guān)鍵字怎么用
標(biāo)題鏈接:http://muchs.cn/article44/ihcgee.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供軟件開(kāi)發(fā)、網(wǎng)站設(shè)計(jì)公司、網(wǎng)站排名、網(wǎng)站建設(shè)定制網(wǎng)站、小程序開(kāi)發(fā)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

綿陽(yáng)服務(wù)器托管