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