web-dev-qa-db-ja.com

Kotlinでは、複数のコンストラクターを持つクラスをどのように拡張できますか?

私はKotlinの学習を処理しており、理解できない問題に遭遇しました。 KotlinでJavaクラスRuntimeExceptionを拡張し、さまざまな状況で、コンストラクターの3つのうちのいずれか1つを使用できるようにします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の例では、常に2つの引数を使用してスーパーコンストラクターを呼び出していますが、状況に最も適したコンストラクターを呼び出しているわけではありません。したがって、上記の機能は動作しますが、Javaで各状況で異なるコンストラクターが呼び出されます。上記の各fun内で新しいRuntimeExceptionをインスタンス化しようとしました。それをPhotoLibExceptionにキャストしましたが、それを許可されませんでした。

Kotlinでこれを正しく行う方法を誰でも提案できますか?

48
Steve Moseley

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) {}
}

現在、同じクラスから異なるコンテキストで異なるスーパーコンストラクターを呼び出す方法はありません。ただし、今後数か月でサポートされる予定です。

101
Andrey Breslav