Kotlin: ¿Cómo puedo crear una function henetworkingable "estática"?

Por ejemplo, quiero tener un example() function example() en un tipo Child que extiende Parent para que pueda usar la function en ambos.

 Child.example() Parent.example() 

La primera forma "obvia" de hacerlo es a través del object complementario de Parent , pero esto no permite example() para Child .

La segunda forma en que lo intenté fue definir una function de extensión en Parent.Companion , lo cual es inconveniente porque se lo obliga a definir un object complementario. Tampoco permite el example() para Child .

¿Alguien sabe cómo puedo hacer esto?

Solutions Collecting From Web of "Kotlin: ¿Cómo puedo crear una function henetworkingable "estática"?"

Lo que estás pidiendo no existe, pareces estar preguntando:

¿Puedo hacer reference a un método de object complementario de una superclass a partir de una reference de class de sus descendientes?

o tal vez estás preguntando:

¿Puedo hacer reference a un miembro estático de una superclass desde una reference de sus descendientes?

La respuesta para ambos es no . Es por layout de Kotlin que esto no se permite, fue una decisión consciente, fue intencional. Si desea cambiar esta decisión, deberá presentar un problema en YouTrack . Los progtwigdores en Java estaban muy confundidos por la inheritance y la anulación de los methods estáticos y el comportamiento cuando se llama desde una reference a otra y cómo se resuelve estáticamente en lugar de dinámicamente. El equipo de Java 8 al agregar methods estáticos a las interfaces se da count de la confusión que esto podría causar, por lo que tomaron un enfoque más de Kotlin de solo permitir que sea llamado por la reference de la interfaz. Para evitar este tipo de pesadillas, el equipo de Kotlin lo desestimó. Del mismo modo que no permitieron muchos otros aspectos confusos de Java.

Las otras respuestas (@ voddan, por ejemplo) te ofrecen alternativas para tener la misma sensación de syntax de llamada al usar objects complementarios, pero rechazas esas en tus comentarios diciendo que quieres evitar un object complementario, aunque tu pregunta te indique están tratando de usarlos. Entonces, suponiendo que no quiera usarlos, la respuesta es simplemente no, no se puede hacer .

Para deshacerse del object complementario, desearía hablar sobre ¿Pueden llamarse las funciones de extensión de una manera "estática"? … que será decepcionante ya que aún no está permitido.

Volviendo a los objects complementarios (lo siento, pero son el único path hacia la gloria aquí), también puedes simplemente delegar manualmente el método del niño al padre:

 open class Parent { companion object { // requinetworking, sorry, no way around it! fun foo() = /* some cool logic here */ } } class Child: Parent() { companion object { // requinetworking, sorry, no way around it! fun foo() = Parent.foo() } } 

O como extensiones

 open class Parent { companion object {} // requinetworking, sorry, no way around it! } class Child: Parent() { companion object {} // requinetworking, sorry, no way around it! } fun Parent.Companion.foo() = /* some cool logic here */ fun Child.Companion.foo() = Parent.foo() 

Dado que los objects complementarios juegan con las mismas reglas que cualquier otro, es fácil usar medios normales de reutilización de código en ellos:

 open class Example { fun example() {} } class Parent { companion object : Example() } class Child { companion object : Example() } fun main(args: Array<String>) { Child.example() Parent.example() } 

Alternativamente, con la delegación de classs, puede reutilizar la implementación desde Parent directamente:

 interface Example { fun example() } class Parent { companion object : Example { override fun example() {} } } class Child { companion object : Example by Parent.Companion } 

El objective es crear un "operador alternativo" para la construcción

En Java, debe usar Factory en lugar de un método estático cuando se usa como "constructor".

En el lado de Kotlin podría usar una function de nivel superior en lugar de una fábrica.

O si realmente desea tener un "método estático" en su class, crearía un object complementario y agregaría methods de extensión estáticos.