以下の様に、車(Car)抽象クラスから各メーカーの車具象クラス(**Car)へ継承させているとき、case classを使っているのでコンパニオンオブジェクトを使ってnew を使わずにインスタンスを作りたいのですが、結局コンパニオンオブジェクトにも具象クラスでコンストラクタみたいに使っているメソッドを書かなければならず冗長になっています。何か他にスマートな書き方がありますでしょうか?
悩みどころ
抽象クラスからoverrideしたcreateメソッド(セッター)からインスタンスを作りたいが、コンパニオンオブジェクトのファクトリメソッドからインスタンスを作るとなるとこの(抽象クラスで用意した方の)定義がそもそも不要という。(やってることがおかしい?)
所感
Car.manufacturerだけは具象クラスの名称に紐づくので、各具象クラスのインスタンスが作られた段階で自動的にセットされてほしい(createでセットしたくない)ので分離しているからがめんどくささの原因か。
scala
1 2sealed abstract class Car(val manufacturer: String) { 3 val color: String 4 val ... 5 def create(c: String, ...): Car 6} 7 8case class ToyotaCar(color: String) extends Car("トヨタ") { 9 override def create(c: String, ...): ToyotaCar = { 10 ToyotaCar( 11 color = c, 12 ... 13 ) 14 } 15} 16 17case class NissanCar(color: String) extends Car("日産") { 18 override def create(c: String, ...): NissanCar = { 19 NissanCar( 20 color = c, 21 ... 22 ) 23 } 24} 25 26// 上のコードと重複 27object ToyotaCar { 28 def create: ToyotaCar = { 29 ToyotaCar( 30 color = "red", 31 ... 32 ) 33 } 34} 35 36object NissanCar { 37... 38} 39 40 41 42val toyota = ToyotaCar.create("red", ...) 43val nissan = NissanCar.create("blue", ...) 44 45println(s"メーカー: ${toyota.manufacturer}, 色: ${toyota.color}, ...") 46println(s"メーカー: ${nissan.manufacturer}, 色: ${nissan.color}, ...") 47// 期待値 48// メーカー: トヨタ, 色: red, ... 49// メーカー: 日産, 色: blue, ...
提案?
コンパニオンオブジェクトのファクトリメソッドを具象クラスのフィールドの初期化(適当な値を代入し、createでセットする感じ)に利用することで一応役割は分担できた。不格好ではありますが。。(-_-;)
scala
1... 2object ToyotaCar { 3 def apply: ToyotaCar = { 4 ToyotaCar( 5 color = "", 6 ... 7 ) 8 } 9} 10... 11 12val toyota = ToyotaCar.apply.create("red", ...) 13val nissan = NissanCar.apply.create("blue", ...) 14 15println(s"メーカー: ${toyota.manufacturer}, 色: ${toyota.color}, ...") 16println(s"メーカー: ${nissan.manufacturer}, 色: ${nissan.color}, ...") 17// メーカー: トヨタ, 色: red, ... 18// メーカー: 日産, 色: blue, ...
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/12/02 12:50 編集