千家信息网

Kotlin的by关键字怎么用

发表于:2026-11-03 作者:千家信息网编辑
千家信息网最后更新 2026年11月03日,这篇"Kotlin的by关键字怎么用"文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇"K
千家信息网最后更新 2026年11月03日Kotlin的by关键字怎么用

这篇"Kotlin的by关键字怎么用"文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇"Kotlin的by关键字怎么用"文章吧。

委托模式已已经证明是实现继承的一个很好的替代方式

Kotlin 中 by 就是用于实现委托的。

fun main(args: Array) {
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) {
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{
overrideval message: String="base----$x"

override fun printMessage() = print(x)

override fun printLine() = println(message)

}
class Derived(b: Base) :Base by b{
overrideval 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) {
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 {
operator fun getValue(thisRef: R, property: KProperty<*>): T
}

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

以上就是关于"Kotlin的by关键字怎么用"这篇文章的内容,相信大家都有了一定的了解,希望小编分享的内容对大家有帮助,若想了解更多相关的知识内容,请关注行业资讯频道。

委托 函数 属性 类型 内容 关键 关键字 参数 成员 方法 对象 接口 相同 就是 文章 知识 篇文章 价值 原本 可以通过 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 云南咖啡 互联网科技 互联网金融监管科技数据 互联网科技革命 极限挑战互联网科技 狮子座互联网科技培训 上海卓越科技 互联网 互联网科技类展会 常德市电业局互联网科技部 顶级互联网科技成果有哪些 华服互联网科技官网 南山科技园互联网公司有哪些 宁夏众和广鑫互联网科技有限公司 互联网软件和科技 工业互联网山东科技大学 互联网金融科技公司的优势 郑州欣桑互联网科技有限公司 福建互联网展示科技馆设计 银川新华互联网科技学校是国营吗 兰石爱特工业互联网科技分公司 广州百单互联网科技有限公司 广州紫鲸互联网科技 隆华科技工业互联网 中国的互联网科技企业的崛起 昭通云南众福互联网科技有限公司 华夏恒生科技与互联网科技 保险科技服务互联网营销体系 区块链结合互联网科技 长沙渺峰互联网科技有限公司 河南商务圈互联网科技有限公司
0