Kotlin: delegación de funciones

Tengo un proyecto que depende en gran medida de la delegación y la composition en Kotlin. Delegar properties es muy fácil, pero conceptualmente no estoy completamente seguro de cómo lograr la delegación de funciones en circunstancias en las que las funciones dependen de otras properties compuestas. Me gustaría hacer algo como esto:

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) 

Por supuesto, este tipo de cosas se podrían lograr con lo siguiente:

 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 

pero esto se siente torpe ya que requiere pasar objects por composition que hinche el tamaño de los constructores – sería más limpio para mí inicializar los objects en el sitio de la class en sí, ya que no tienen uso fuera de la class. ¿Hay una forma elegante de hacerlo con delegación y / o extensiones?

Puede hacer que C extienda A y B lugar de pasarle un delegado. p.ej:

 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() 

También puede hacer esto con una implementación pnetworkingeterminada en C sin un CImpl :

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

No creo que esto se soporte actualmente muy bien, pero hay un problema que rastrea esta y las requestes de funciones relacionadas. (Ver el comentario de Peter Niederwieser sobre el tema).

  • Cómo implementar lateinit correctamente con objects de class personalizados para usar en onCreate () en Android evitando el error 'Property getter or setter expected'
  • ¿Cuál es la mejor manera de tomar una foto y mostrar el resultado usando Kotlin Anko?
  • Invertir un infijo boolean resultado kotlin
  • ¿Cómo crear un intervalo infinito observable que emitirá un nuevo object cada intervalo de time?
  • ¿Cuál es el equivalente de Kotlin de Java Stream.collect?
  • Iteración de files, split por patrón
  • Clase de aplicación Kotlin SingleTon
  • Kotlin: forma idiomática de llamar (Int, Int) -> Int con un par <Int, Int>?
  • Cómo inyectar dependencies en una aplicación ktor
  • ¿Cómo replace webView por webView personalizado?
  • Kapt generatestubs: no se puede inicializar el object con el constructor interno de la unit testing