Kotlin:功能委派

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

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 

但是这样感觉笨拙,因为它需要传递构造函数大小的构件的对象 – 对于我来说,初始化类本身的对象是更清洁的,因为它们在类之外没有用处。 有没有一个优雅的方式与委派和/或扩展?

你可以让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() 

你也可以在没有CImpl的情况下在C使用默认的实现来完成这个CImpl

 interface C : A, B { fun c(): String = a + b } class ABC : A by AImpl(), B by BImpl(), C 

我不认为这是支持得很好,但有一个问题 ,跟踪这个和相关的功能要求。 (见Peter Niederwieser对这个问题的评论。)