異なるスーパークラスのコンストラクタを呼び出す:Kotlinのコンストラクタのプロパティと、私は罰金思われる、例外としてkotlinデータクラスを使用したい
data class MyException(val extraData: Any) : RuntimeException()
私もcause
に渡すことができるようにしたいのですがあるクラスが存在する場合はスーパークラスです。残念ながら、データクラスは彼らの主要なコンストラクタでval
/var
を持つことができ、デフォルトコンストラクタが引数なしのRuntimeException()
コンストラクタを呼び出しているので、ととして保存され、私は単純に常に渡されるcause
を必要とせずに、これを行うことができないようです私のクラスのフィールド、私はしたくないです。
は、私が欲しいのはこのようなものです:
data class MyException(val extraData: Any) : RuntimeException() {
constructor(extraData: Any, cause: Throwable) : this(extraData) super(cause) {}
}
私がデータクラスを使用しない場合でも、彼らができるので、私はまだ、便利var
/val
コンストラクタヘルパーを使用することができないようですどのスーパーコンストラクタを使用するかを選択しなければならない主コンストラクタ上にのみ存在します。私が思いつくことができる最高のものは、これはかなり冗長です:
class MyException : RuntimeException {
val extraData: Any
constructor(extraData: Any) {
this.extraData = extraData
}
constructor(extraData: Any, cause: Throwable) : super(cause) {
this.extraData = extraData
}
}
私には何かが欠けていますか?オーバーロードされたコンストラクタに基づいて条件付きで別のスーパークラスのコンストラクタを呼び出し、まだパラメータ構文をvar
/val
使用できる方法はありませんか?もしそうなら、なぜですか?このようなことをするより良い方法がありますか?
ありがとうございました。これと@ holi-javaの答えは、Exceptionがnullの原因を許可して正しく処理するので、Exceptionの場合にはどちらも優れています。異なるスーパーコンストラクタを呼び出すことができず、 'var' /' val'パラメータも使用できないという、より一般的な問題は未だに解決されていません。 –
@ YonaAppletree要するに、これは不可能です。しかし、あなたが説明を探している場合は、私はそれを答えに加えました。 – Malcolm