2018年11月10日土曜日

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

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



0 件のコメント:

コメントを投稿