首页 文章

在Kotlin中,如何扩展具有多个构造函数的类?

提问于
浏览
36

我在学习Kotlin的过程中,遇到了一个我无法弄清楚的问题 . 我想在Kotlin中扩展Java类RuntimeException,并且能够在不同的情况下使用它的三个构造函数中的任何一个(基于我想要抛出异常时的信息) . 在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中执行此操作时,我使用此答案作为指导:Kotlin secondary constructor但是,我在尝试弄清楚如何正确调用适当的超级构造函数时遇到了问题 . 例如,使用函数似乎是一个很好的方法,如下所示:

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示例中,我总是使用两个args调用超级构造函数,而不是调用最适合该情况的构造函数 . 所以我上面的工作,但不完全是在Java中做的事情,在每种情况下调用不同的构造函数 . 我还尝试在上面的每个乐趣中实例化一个新的RuntimeException,并将其转换为PhotoLibException,但我不允许这样做 .

任何人都可以建议我如何在Kotlin中正确地做到这一点?

1 回答

  • 77

    Update :自M11(0.11 . *)以来,您可以使用secondary constructors来解决此问题:

    class PhotoLibException : RuntimeException {
        constructor(message: String, ex: Exception?): super(message, ex) {}
        constructor(message: String): super(message) {}
        constructor(ex: Exception): super(ex) {}
    }
    

    目前,没有办法在同一个类的不同上下文中调用不同的超级构造函数 . 不过,它将在未来几个月内得到支持 .

相关问题