constructor - primary - kotlin new object
En Kotlin, ¿cómo extiendo una clase que tiene múltiples constructores? (1)
Estoy en el proceso de aprender Kotlin, y me encontré con un problema que no pude resolver. Me gustaría extender la clase de Java RuntimeException en Kotlin, y poder usar cualquiera de sus tres constructores, en diferentes circunstancias (según la información que tengo en ese momento, quiero lanzar una excepción). En java mi clase se vería así:
public class PhotoLibException extends RuntimeException {
public PhotoLibException(String message, RuntimeException ex) {
super(message, ex);
}
public PhotoLibException(String message) {
super(message);
}
public PhotoLibException(RuntimeException ex) {
super(ex);
}
}
Cuando trato de hacer esto en Kotlin, utilicé esta respuesta como guía: sin embargo, el constructor secundario de Kotlin tenía un problema al tratar de averiguar cómo invocar correctamente al súper constructor. Por ejemplo, usar funciones parece ser un buen enfoque, como este:
fun PhotoLibException(message: String): PhotoLibException {
val ex = null
return PhotoLibException(message, ex)
}
fun PhotoLibException(ex: Exception): PhotoLibException {
val message = ""
return PhotoLibException(message, ex)
}
class PhotoLibException(message: String, ex: Exception?): RuntimeException(message, ex) {
}
Sin embargo, en este ejemplo de Kotlin anterior, siempre invoco al súper constructor con dos argumentos, y no invoco al constructor más apropiado para la situación. Entonces, lo que tengo arriba funciona, pero no hace exactamente lo que haría en Java cuando se invoca un constructor diferente en cada situación. También traté de crear una instancia de una nueva excepción RuntimeException dentro de cada una de las diversiones anteriores y enviarla a PhotoLibException, pero no se me permitió hacerlo.
¿Alguien puede sugerir cómo haría esto correctamente en Kotlin?
Actualización : Desde M11 (0.11. *), Puede usar constructores secundarios para resolver este problema:
class PhotoLibException : RuntimeException {
constructor(message: String, ex: Exception?): super(message, ex) {}
constructor(message: String): super(message) {}
constructor(ex: Exception): super(ex) {}
}
Actualmente, no hay manera de llamar a diferentes super-constructores en contextos diferentes de la misma clase. Sin embargo, será apoyado en los próximos meses.