gpt4 book ai didi

Kotlin:函数委托(delegate)

转载 作者:行者123 更新时间:2023-12-04 19:29:57 26 4
gpt4 key购买 nike

我有一个项目在很大程度上依赖于 Kotlin 中的委托(delegate)和组合。委托(delegate)属性是轻而易举的事,但从概念上讲,我不完全确定在函数依赖于其他组合属性的情况下如何实现函数的委托(delegate)。我想做这样的事情:

interface A {
val a: String
}
class AImpl: A {
override val a = "a"
}
interface B {
val b: String
}
class BImpl: B {
override val b = "b"
}

interface C<T> where T: A, T: B {
fun c() : String
}

class CImpl<T>(val ab: T) : C<T> where T: A, T: B {
override fun c() = ab.a + ab.b
}

// works
class ABC : A by AImpl(), B by BImpl()

// does not work
class ABC : A by AImpl(), B by BImpl(), C<ABC> by CImpl(this)

当然,这种类型的事情可以通过以下方式实现:
interface A {
val a: String
}
class AImpl: A {
override val a = "a"
}
interface B {
val b: String
}
class BImpl: B {
override val b = "b"
}

interface C<T> where T: A, T: B {
fun c() : String
}

class CImpl<T>(val ab: T) : C<T> where T: A, T: B {
override fun c() = ab.a + ab.b
}

class AB : A by AImpl(), B by BImpl()

class ABC(ab: AB = AB(), c: C<AB> = CImpl<AB>(ab)) : A by ab, B by ab, C<AB> by c

但这感觉很笨拙,因为它需要传入用于组合的对象,这会使构造函数的大小膨胀——对我来说,在类本身的位置初始化对象会更干净,因为它们在类之外没有用处。委托(delegate)和/或扩展是否有一种优雅的方法?

最佳答案

您可以制作C延长 AB而不是传递给它一个代表。例如。:

interface C : A, B {
fun c(): String
}

abstract class CImpl() : C {
abstract override val a: String
abstract override val b: String
override fun c(): String = a + b
}

class ABC : A by AImpl(), B by BImpl(), CImpl()

您也可以使用 C 中的默认实现来做到这一点。没有 CImpl :
interface C : A, B {
fun c(): String = a + b
}

class ABC : A by AImpl(), B by BImpl(), C

关于Kotlin:函数委托(delegate),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44745599/

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