- Kotlin 教程
- Kotlin - 主页
- Kotlin - 概述
- Kotlin - 环境设置
- Kotlin - 架构
- Kotlin - 基本语法
- Kotlin - 评论
- Kotlin - 关键字
- Kotlin - 变量
- Kotlin - 数据类型
- Kotlin - 运算符
- Kotlin - 布尔值
- Kotlin - 字符串
- Kotlin - 数组
- Kotlin - 范围
- Kotlin - 函数
- Kotlin 控制流程
- Kotlin - 控制流
- Kotlin - if...Else 表达式
- Kotlin - When 表达式
- Kotlin - For 循环
- Kotlin - While 循环
- Kotlin - 中断并继续
- Kotlin 集合
- Kotlin - 集合
- Kotlin - 列表
- Kotlin - 集
- Kotlin - 地图
- Kotlin 对象和类
- Kotlin - 类和对象
- Kotlin - 构造函数
- Kotlin - 继承
- Kotlin - 抽象类
- Kotlin - 接口
- Kotlin - 可见性控制
- Kotlin - 扩展
- Kotlin - 数据类
- Kotlin - 密封类
- Kotlin - 泛型
- Kotlin - 委托
- Kotlin - 解构声明
- Kotlin - 异常处理
- Kotlin 有用资源
- Kotlin - 快速指南
- Kotlin - 有用的资源
- Kotlin - 讨论
Kotlin - 委托
Kotlin通过引入新的关键字“by”来支持“委托”设计模式。使用此关键字或委托方法,Kotlin 允许派生类通过特定对象访问接口的所有已实现的公共方法。以下示例演示了 Kotlin 中如何发生这种情况。
interface Base { fun printMe() //abstract method } class BaseImpl(val x: Int) : Base { override fun printMe() { println(x) } //implementation of the method } class Derived(b: Base) : Base by b // delegating the public method on the object b fun main(args: Array<String>) { val b = BaseImpl(10) Derived(b).printMe() // prints 10 :: accessing the printMe() method }
在示例中,我们有一个接口“Base”,其抽象方法名为“printme()”。在 BaseImpl 类中,我们正在实现这个“printme()”,稍后我们在另一个类中使用“by”关键字来使用这个实现。
上面的代码将在浏览器中产生以下输出。
10
财产委托
在上一节中,我们学习了使用“by”关键字的委托设计模式。在本节中,我们将学习使用 Kotlin 库中提到的一些标准方法来委托属性。
委托意味着将责任传递给另一个类或方法。当属性已经在某些地方声明时,我们应该重用相同的代码来初始化它们。在下面的示例中,我们将使用 Kotlin 提供的一些标准委托方法和一些标准库函数来实现委托。
使用 Lazy()
Lazy 是一个 lambda 函数,它接受一个属性作为输入,并返回一个Lazy<T>实例,其中 <T> 基本上是它所使用的属性的类型。让我们看一下下面的内容来了解它是如何工作的。
val myVar: String by lazy { "Hello" } fun main(args: Array<String>) { println(myVar +" My dear friend") }
在上面的代码中,我们将变量“myVar”传递给 Lazy 函数,该函数反过来将值分配给其对象,并将相同的值返回给主函数。以下是浏览器中的输出。
Hello My dear friend
委托.Observable()
Observable() 使用两个参数来初始化对象并将其返回给被调用的函数。在下面的示例中,我们将看到如何使用 Observable() 方法来实现委托。
import kotlin.properties.Delegates class User { var name: String by Delegates.observable("Welcome to Tutorialspoint.com") { prop, old, new -> println("$old -> $new") } } fun main(args: Array<String>) { val user = User() user.name = "first" user.name = "second" }
上面的代码将在浏览器中产生以下输出。
first -> second
一般来说,语法就是“by”关键字被委托后的表达式。变量p的get ()和set()方法将被委托给Delegate 类中定义的getValue()和setValue()方法。
class Example { var p: String by Delegate() }
对于上面的代码,以下是我们需要生成的委托类,以便为变量p赋值。
class Delegate { operator fun getValue(thisRef: Any?, property: KProperty<*>): String { return "$thisRef, 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.'") } }
读取时,将调用 getValue() 方法;设置变量时,将调用 setValue() 方法。