2018年11月10日土曜日

sealed class に共通データを持たせるときは abstract val にする

sealed class Pet を継承した data class Cat と Dog があるとします。 sealed class Pet data class Cat(val name: String, val kind: CatKind) : Pet() data class Dog(val name: String, val kind: DogKind) : Pet() name プロパティは Pet として必須なので Pet class に持たせたいですね。
しかし次のように primary コンストラクタの property paramter として持たせようとするとコンパイルエラーになります。 sealed class Pet(val name: String) data class Cat(name: String, val kind: CatKind) : Pet(name) // コンパイルエラー data class Dog(name: String, val kind: DogKind) : Pet(name) // コンパイルエラー data class の primary コンストラクタは property parameter (val or var) しか持てないからです。 そこで、どうするかというと name を abstract val として Pet に持たせます。 sealed class Pet { abstract val name: String } data class Cat(override val name: String, val kind: CatKind) : Pet() data class Dog(override val name: String, val kind: DogKind) : Pet()


0 件のコメント:

コメントを投稿