В Kotlin, как мне расширить класс, который имеет несколько конструкторов?
Я занимаюсь обработкой обучения Котлин и столкнулся с проблемой, которую я не мог понять.
Я хотел бы расширить класс RuntimeException Java в Kotlin и иметь возможность использовать любой из трех его конструкторов в разных обстоятельствах (на основе того, какую информацию у меня есть в то время, когда я хочу выбросить исключение). В java мой класс будет выглядеть так:
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);
}
}
Когда я пытаюсь сделать это в Котлине, я использовал этот ответ в качестве руководства: вторичный конструктор Kotlin, однако у меня была проблема с попыткой выяснить, как вызвать соответствующий суперструктор правильно. Например, использование функций, казалось, было хорошим подходом, например:
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) {
}
Однако в этом выше примере Kotlin я всегда вызываю суперструктор с двумя аргументами и не ссылаюсь на конструктор, наиболее подходящий для ситуации. Итак, то, что у меня выше, работает, но не делает точно, что он будет делать на Java, где в каждой ситуации вызывается другой конструктор.
Я также попытался создать экземпляр нового RuntimeException внутри каждой забавы выше и отбросить его в PhotoLibException, но мне не было позволено это делать.
Кто-нибудь может предложить, как я буду делать это правильно в Котлин?
Ответы
Ответ 1
Обновить: с помощью M11 (0.11. *) вы можете использовать вспомогательные конструкторы для решения этой проблемы:
class PhotoLibException : RuntimeException {
constructor(message: String, ex: Exception?): super(message, ex) {}
constructor(message: String): super(message) {}
constructor(ex: Exception): super(ex) {}
}
В настоящее время нет способа вызвать разные супер-конструкторы в другом контексте из того же класса. Однако он будет поддержан в ближайшие месяцы.