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

Delegetion.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”关键字后的表达式是委托的表达式。变量pget()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() 方法。

广告