解释一下kotlin语法中的by,并举例说明
时间: 2024-03-28 10:41:39 浏览: 204
在 Kotlin 中,`by` 是一个关键字,它被用于实现委托模式。委托模式可以用于避免重复代码的编写和提高代码的复用性。通过委托模式,我们可以将一个类的某个属性或方法的实现委托给另一个类。
例如,假设我们有一个类 `Derived`,它想要继承自 `Base` 并实现其 `foo()` 方法。我们可以使用委托模式来实现:
```kotlin
interface Base {
fun foo()
}
class BaseImpl(val x: Int) : Base {
override fun foo() { println(x) }
}
class Derived(b: Base) : Base by b
fun main() {
val b = BaseImpl(10)
Derived(b).foo() // 输出 10
}
```
在上面的例子中,`BaseImpl` 实现了 `Base` 接口的 `foo()` 方法。然后,我们创建了一个名为 `b` 的 `BaseImpl` 对象,并把它传递给了 `Derived` 类的构造函数。在 `Derived` 类中,我们使用了 `by` 关键字来委托 `foo()` 方法的实现给了 `b` 对象。这样,当我们调用 `Derived` 对象的 `foo()` 方法时,它会自动调用 `BaseImpl` 对象的 `foo()` 方法,并输出 `10`。
除了委托给一个对象,我们还可以委托给一个表达式。例如:
```kotlin
val p: String by lazy {
// 初始化代码
"hello"
}
fun main() {
println(p) // 输出 hello
}
```
在上面的例子中,我们使用 `lazy` 关键字来延迟初始化一个字符串变量 `p`。这个变量的实际值会在第一次访问时被计算出来。我们把计算值的表达式委托给了一个 lambda 表达式,该表达式在变量第一次被访问时被执行。所以,当我们在 `main()` 函数中访问 `p` 变量时,它会输出 `hello`。
阅读全文