gpt4 book ai didi

kotlin - kotlin 委托(delegate)有什么用?

转载 作者:IT老高 更新时间:2023-10-28 13:41:30 35 4
gpt4 key购买 nike

我真的对 kotlin 代表团感到困惑。让我在这里描述一下看起来像 kotlin 委托(delegate)的常规多态方法。

interface Base {
fun print()
}
class BaseImpl(val x: Int) : Base {
override fun print() { print(x) }
}
fun main(args: Array<String>) {
val b : Base = BaseImpl(10)
b.print() // prints 10
}

我可以将任何实现的Base接口(interface)类传递给b变量来调用指定类对象的方法。那么kotlin的委托(delegate)有什么好处呢?描述here .

interface Base {
fun print()
}
class BaseImpl(val x: Int) : Base {
override fun print() { print(x) }
}
class Derived(b: Base) : Base by b // why extra line of code?
// if the above example works fine without it.
fun main(args: Array<String>) {
val b = BaseImpl(10)
Derived(b).print() // prints 10
}

我知道这是两个代码都可以正常工作的简单场景。委托(delegate)应该有一个好处,这就是 kotlin 引入它的原因。有什么区别?以及 kotlin 委托(delegate)如何有用?请给我一个工作示例来与多态方法进行比较。

最佳答案

还请记住,您不仅限于一名代表。 Kotlin 实现委托(delegate)的方式类似于 Groovy 等语言中的 traits 实现。您可以通过委托(delegate)组合不同的功能。 Kotlin 的方式也可以被认为更强大,因为您也可以“插入”不同的实现。

interface Marks {
fun printMarks()
}

class StdMarks() : Marks {
override fun printMarks() { println("printed marks") }
}

class CsvMarks() : Marks {
override fun printMarks() { println("printed csv marks") }
}

interface Totals {
fun printTotals()
}

class StdTotals : Totals {
override fun printTotals() { println("calculated and printed totals") }
}

class CheatTotals : Totals {
override fun printTotals() { println("calculated and printed higher totals") }
}

class Student(val studentId: Int, marks: Marks, totals: Totals)
: Marks by marks, Totals by totals

fun main(args:Array<String>) {
val student = Student(1,StdMarks(), StdTotals())
student.printMarks()
student.printTotals()
val cheater = Student(1,CsvMarks(), CheatTotals())
cheater.printMarks()
cheater.printTotals()
}

输出:

printed marks
calculated and printed totals
printed csv marks
calculated and printed higher totals

继承不能做到这一点。

关于kotlin - kotlin 委托(delegate)有什么用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44231619/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com