En Kotlin tengo un código como el siguiente:
open class A { protected open fun B.doSomething() {} } class B {} class C : A() { override fun B.doSomething() { print("first, do some C-specific logic") print("now try to call super implementation. How?") super.doSomething() // does not compile super<A>.doSomething() // does not compile super<B>.doSomething() // does not compile } }Y me gustaría saber, ¿cómo puedo llamar a la implementación de superclase de doSomething() en este caso? ¿O no es posible llamar a una súper implementación para una función de extensión en kotlin?
Este problema se ha informado en KT-11488 . Actualmente no es posible. La especificación de Kotlin dice que los miembros candidatos para una llamada super se encuentran de la siguiente manera:
Para una
finvocable con un receptor de superforma básico explícitosuperen una declaración de clasificador con supertipos A1, A2, …, AN, se consideran los siguientes conjuntos para no vacíos:
- Llamables de miembros que no son de extensión denominados
fde tipoA1;- Llamables de miembros que no son de extensión denominados
fde tipoA2;- …;
- Llamables de miembros que no son de extensión denominados
fde tipoAN.Si al menos dos de estos conjuntos no están vacíos, se trata de un error de tiempo de compilación. De lo contrario, el conjunto no vacío (si lo hay) se analiza como de costumbre.
Para una
finvocable con unsuper<A>receptor de superforma extendido explícito, se analizan los siguientes conjuntos (en el orden dado):
- Llamables de miembros que no son de extensión denominados
fde tipoA.
Como puede ver, solo se consideran los "miembros que no son de extensión". Las funciones de extensión no se consideran en absoluto.
Por ahora, puede hacer una solución como esta (también se sugiere algo similar en el ticket):
open class A { protected open fun B.doSomething() = bDoSomething(this) // make a non-extension function to put A's implementation in there protected fun bDoSomething(receiver: B) { print("A implementation") } } class C : A() { override fun B.doSomething() { print("first, do some C-specific logic") super.bDoSomething(this) // call the non-extension function } }