91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Kotlin的by關鍵字怎么用

發布時間:2022-03-22 10:29:38 來源:億速云 閱讀:489 作者:iii 欄目:互聯網科技

這篇“Kotlin的by關鍵字怎么用”文章的知識點大部分人都不太理解,所以小編給大家總結了以下內容,內容詳細,步驟清晰,具有一定的借鑒價值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來看看這篇“Kotlin的by關鍵字怎么用”文章吧。

委托模式已已經證明是實現繼承的一個很好的替代方式

Kotlin 中 by 就是用于實現委托的。

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子句 會將b 存儲Derived內部,并且編譯器會生成所有b類型的方法

覆蓋由委托實現的接口成員
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 可以重寫方法,但是重寫的成員不會在委托對象的成員中調用

屬性委托
屬性委托的語法: val/var <屬性名>: <類型> by <表達式>

屬性委托不需要實現任何接口但是要重寫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()
}
當我們從委托到一個 Delegate實例的 str讀取時,將調用Delegate中的 getValue() 函數, 所以它第一個參數是讀出str的對象、第二個參數保存了對str自身的描述 (例如你可以取它的名字)。

setValue 同理

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

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

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

thisRef —— 同 getValue();
property —— 同 getValue();
new value —— 必須與屬性同類型或者是它的超類型。
getValue() 或/與 setValue() 函數可以通過委托類的成員函數提供或者由擴展函數提供。 當你需要委托屬性到原本未提供的這些函數的對象時后者會更便利。 兩函數都需要用 operator 關鍵字來進行標記。

委托類可以實現包含所需 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)
}

以上就是關于“Kotlin的by關鍵字怎么用”這篇文章的內容,相信大家都有了一定的了解,希望小編分享的內容對大家有幫助,若想了解更多相關的知識內容,請關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

五家渠市| 巢湖市| 奈曼旗| 郑州市| 阳原县| 繁昌县| 郴州市| 巴林右旗| 荥经县| 栾川县| 宜丰县| 双鸭山市| 砀山县| 黄平县| 镇远县| 双桥区| 沭阳县| 西华县| 新沂市| 手游| 通化县| 衡东县| 天等县| 建宁县| 阿城市| 青神县| 盘锦市| 西贡区| 汉中市| 新宁县| 邳州市| 黔江区| 沁阳市| 福海县| 长葛市| 塔城市| 布拖县| 潞城市| 岐山县| 宣恩县| 吴川市|