Подтвердить что ты не робот

В 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, но мне не было позволено это делать.

Кто-нибудь может предложить, как я буду делать это правильно в Котлин?

4b9b3361

Ответ 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) {}
}

В настоящее время нет способа вызвать разные супер-конструкторы в другом контексте из того же класса. Однако он будет поддержан в ближайшие месяцы.