質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Scala

ScalaはJava仮想マシンで動作を行うオブジェクト指向型プログラミング言語の1つです。静的型付けの関数型言語で、コンパイルエラーの検出に強みがあります。

Q&A

解決済

1回答

631閲覧

Scala 抽象クラスを継承したサブクラスのインスタンス生成方法

yochun02

総合スコア76

Scala

ScalaはJava仮想マシンで動作を行うオブジェクト指向型プログラミング言語の1つです。静的型付けの関数型言語で、コンパイルエラーの検出に強みがあります。

0グッド

0クリップ

投稿2021/12/02 04:25

編集2021/12/02 06:26

以下の様に、車(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, ...

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

今の内容だとCarクラスにcreateがある必要性がないので、それを消せば解決するように思えます。
目指してるところは、Factory Methodパターンなのかなとは思うのでそれでググってみてください。

投稿2021/12/02 10:20

yudedako67

総合スコア2047

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yochun02

2021/12/02 12:50 編集

factory method patternを調べてみましたが、なるほどどうにも今の実装だとインスタンス化処理を分離するクラスが足りないみたいですね。 createを別のファクトリクラスに持たせて、具象クラスのインスタンス化をそこでのみ行うようにすればよさそうです。 ご助言ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問