Función delegada de llamada (base) al usar la delegación de class desde dentro de anulación

Al anular un método de interfaz implementado por delegación de class , ¿es posible llamar a la class a la que normalmente se delega desde dentro de una function principal? Similar a cómo se llamaría super cuando se usa la inheritance.

De la documentation :

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

Tenga en count que anula el trabajo como podría esperar: el comstackdor utilizará las implementaciones de sobrescritura en lugar de las del object delegado.

 override fun print() { ... } 

¿Cómo llamar a la BaseImpl print() BaseImpl print() desde esta function anulada?

El caso de uso es que deseo agregar lógica adicional a esta function, al time que reutilizo la implementación existente.

    Como Base es una interfaz, realmente no se puede llamar super (similar a Java).

    En su lugar, debe declarar b como un campo y usarlo directamente:

     class Derived(val b: Base) : Base by b { override fun print() { b.print() // ... } } 

    @ La respuesta de Egor funciona y debería ser adecuada cuando la class delegada a se pasa como un parámetro (dependency injection).

    Sin embargo, en mi caso de uso más específico (disculpas por no haber dejado esto claro en mi pregunta ), la implementación se define directamente en la definición de la delegación.

     class Derived(b: Base) : Base by BaseImpl() 

    En este caso, la respuesta de Egor no funciona y se necesita un enfoque más elaborado. La siguiente implementación se puede usar en caso de que quiera mantener oculta la implementación para que las personas que llaman no puedan modificarla. Por ejemplo, en mi caso de uso específico, estoy creando una raíz agregada y quiero proteger las invariantes internas.

     open class HiddenBaseImpl internal constructor( protected val _b: Base ) : Base by _b class Derived() : HiddenBaseImpl( BaseImpl() ) { override fun print() { _b.print() ... do something extra } } 

    Como el constructor primario de HiddenBaseImpl solo se puede usar internamente, los llamadores de la biblioteca no pueden crear una instancia de esta class y, por lo tanto, se ven obligados a utilizar Derived . Derived ahora puede llamar a la class delegada internamente y agregar un comportamiento adicional sin permitir que las personas que llaman pasen diferentes implementaciones de Base .

    Puede llamar directamente a la function print() desde la propiedad b , pero para este propósito necesita cambiar del parámetro simple constructor b: Base al parámetro saving como propiedad private val b: Base

    Espero que esto te ayudará.