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 件のコメント:
コメントを投稿