温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

Kotlin的by关键字怎么用

发布时间:2022-03-22 10:29:38 来源:亿速云 阅读:471 作者: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