teratail header banner
teratail header banner
質問するログイン新規登録

質問編集履歴

8

修正

2021/12/02 06:26

投稿

yochun02
yochun02

スコア76

title CHANGED
File without changes
body CHANGED
@@ -59,7 +59,7 @@
59
59
  ```
60
60
 
61
61
  ##### 提案?
62
- コンパニオンオブジェクトのファクトリメソッドを具象クラスのフィールドの初期化(適当な値を代入し、createでセットする感じ)に利用することで一応役割は分担できた。
62
+ コンパニオンオブジェクトのファクトリメソッドを具象クラスのフィールドの初期化(適当な値を代入し、createでセットする感じ)に利用することで一応役割は分担できた。不格好ではありますが。。(-_-;)
63
63
 
64
64
  ```scala
65
65
  ...

7

修正

2021/12/02 06:26

投稿

yochun02
yochun02

スコア76

title CHANGED
File without changes
body CHANGED
@@ -3,7 +3,7 @@
3
3
  ##### 悩みどころ
4
4
  抽象クラスからoverrideしたcreateメソッド(セッター)からインスタンスを作りたいが、コンパニオンオブジェクトのファクトリメソッドからインスタンスを作るとなるとこの(抽象クラスで用意した方の)定義がそもそも不要という。(やってることがおかしい?)
5
5
  ##### 所感
6
- Car.manufacturerだけは具象クラスの名称に紐づくので、各具象クラスのインスタンスが作られた段階でセットされてほしいので分離している(createでセットしない)からがめんどくささの原因か。
6
+ Car.manufacturerだけは具象クラスの名称に紐づくので、各具象クラスのインスタンスが作られた段階で自動的にセットされてほしい(createでセットしたくない)ので分離しているからがめんどくささの原因か。
7
7
 
8
8
 
9
9
  ```scala

6

補足

2021/12/02 06:25

投稿

yochun02
yochun02

スコア76

title CHANGED
File without changes
body CHANGED
@@ -2,7 +2,10 @@
2
2
 
3
3
  ##### 悩みどころ
4
4
  抽象クラスからoverrideしたcreateメソッド(セッター)からインスタンスを作りたいが、コンパニオンオブジェクトのファクトリメソッドからインスタンスを作るとなるとこの(抽象クラスで用意した方の)定義がそもそも不要という。(やってることがおかしい?)
5
+ ##### 所感
6
+ Car.manufacturerだけは具象クラスの名称に紐づくので、各具象クラスのインスタンスが作られた段階でセットされてほしいので分離している(createでセットしない)からがめんどくささの原因か。
5
7
 
8
+
6
9
  ```scala
7
10
 
8
11
  sealed abstract class Car(val manufacturer: String) {

5

修正

2021/12/02 06:23

投稿

yochun02
yochun02

スコア76

title CHANGED
File without changes
body CHANGED
@@ -8,22 +8,22 @@
8
8
  sealed abstract class Car(val manufacturer: String) {
9
9
  val color: String
10
10
  val ...
11
- def create: Car
11
+ def create(c: String, ...): Car
12
12
  }
13
13
 
14
14
  case class ToyotaCar(color: String) extends Car("トヨタ") {
15
- override def create: ToyotaCar = {
15
+ override def create(c: String, ...): ToyotaCar = {
16
16
  ToyotaCar(
17
- color = "red",
17
+ color = c,
18
18
  ...
19
19
  )
20
20
  }
21
21
  }
22
22
 
23
23
  case class NissanCar(color: String) extends Car("日産") {
24
- override def create: NissanCar = {
24
+ override def create(c: String, ...): NissanCar = {
25
25
  NissanCar(
26
- color = "blue",
26
+ color = c,
27
27
  ...
28
28
  )
29
29
  }
@@ -45,8 +45,8 @@
45
45
 
46
46
 
47
47
 
48
- val toyota = ToyotaCar.create
48
+ val toyota = ToyotaCar.create("red", ...)
49
- val nissan = NissanCar.create
49
+ val nissan = NissanCar.create("blue", ...)
50
50
 
51
51
  println(s"メーカー: ${toyota.manufacturer}, 色: ${toyota.color}, ...")
52
52
  println(s"メーカー: ${nissan.manufacturer}, 色: ${nissan.color}, ...")
@@ -70,8 +70,8 @@
70
70
  }
71
71
  ...
72
72
 
73
- val toyota = ToyotaCar.apply.create
73
+ val toyota = ToyotaCar.apply.create("red", ...)
74
- val nissan = NissanCar.apply.create
74
+ val nissan = NissanCar.apply.create("blue", ...)
75
75
 
76
76
  println(s"メーカー: ${toyota.manufacturer}, 色: ${toyota.color}, ...")
77
77
  println(s"メーカー: ${nissan.manufacturer}, 色: ${nissan.color}, ...")

4

補足追加

2021/12/02 06:18

投稿

yochun02
yochun02

スコア76

title CHANGED
File without changes
body CHANGED
@@ -53,5 +53,28 @@
53
53
  // 期待値
54
54
  // メーカー: トヨタ, 色: red, ...
55
55
  // メーカー: 日産, 色: blue, ...
56
+ ```
56
57
 
58
+ ##### 提案?
59
+ コンパニオンオブジェクトのファクトリメソッドを具象クラスのフィールドの初期化(適当な値を代入し、createでセットする感じ)に利用することで一応役割は分担できた。
60
+
61
+ ```scala
62
+ ...
63
+ object ToyotaCar {
64
+ def apply: ToyotaCar = {
65
+ ToyotaCar(
66
+ color = "",
67
+ ...
68
+ )
69
+ }
70
+ }
71
+ ...
72
+
73
+ val toyota = ToyotaCar.apply.create
74
+ val nissan = NissanCar.apply.create
75
+
76
+ println(s"メーカー: ${toyota.manufacturer}, 色: ${toyota.color}, ...")
77
+ println(s"メーカー: ${nissan.manufacturer}, 色: ${nissan.color}, ...")
78
+ // メーカー: トヨタ, 色: red, ...
79
+ // メーカー: 日産, 色: blue, ...
57
80
  ```

3

内容修正

2021/12/02 06:15

投稿

yochun02
yochun02

スコア76

title CHANGED
File without changes
body CHANGED
@@ -1,7 +1,7 @@
1
1
  以下の様に、車(Car)抽象クラスから各メーカーの車具象クラス(**Car)へ継承させているとき、case classを使っているのでコンパニオンオブジェクトを使ってnew を使わずにインスタンスを作りたいのですが、結局コンパニオンオブジェクトにも具象クラスでコンストラクタみたいに使っているメソッドを書かなければならず冗長になっています。何か他にスマートな書き方がありますでしょうか?
2
2
 
3
3
  ##### 悩みどころ
4
- 抽象クラスからoverrideしたcreateメソッドからインスタンスを作りたいが、コンパニオンオブジェクトのファクトリメソッドからインスタンスを作るとなるとこの(抽象クラスで用意した方の)定義がそもそも不要という。(やってることがおかしい?)
4
+ 抽象クラスからoverrideしたcreateメソッド(セッター)からインスタンスを作りたいが、コンパニオンオブジェクトのファクトリメソッドからインスタンスを作るとなるとこの(抽象クラスで用意した方の)定義がそもそも不要という。(やってることがおかしい?)
5
5
 
6
6
  ```scala
7
7
 

2

補足

2021/12/02 05:52

投稿

yochun02
yochun02

スコア76

title CHANGED
File without changes
body CHANGED
@@ -1,7 +1,7 @@
1
1
  以下の様に、車(Car)抽象クラスから各メーカーの車具象クラス(**Car)へ継承させているとき、case classを使っているのでコンパニオンオブジェクトを使ってnew を使わずにインスタンスを作りたいのですが、結局コンパニオンオブジェクトにも具象クラスでコンストラクタみたいに使っているメソッドを書かなければならず冗長になっています。何か他にスマートな書き方がありますでしょうか?
2
2
 
3
3
  ##### 悩みどころ
4
- 抽象クラスからoverrideしたcreateメソッドからインスタンスを作りたいが、コンパニオンオブジェクトのファクトリメソッドからインスタンスを作るとなるとこの定義がそもそも不要という。(やってることがおかしい?)
4
+ 抽象クラスからoverrideしたcreateメソッドからインスタンスを作りたいが、コンパニオンオブジェクトのファクトリメソッドからインスタンスを作るとなるとこの(抽象クラスで用意した方の)定義がそもそも不要という。(やってることがおかしい?)
5
5
 
6
6
  ```scala
7
7
 

1

補足

2021/12/02 05:06

投稿

yochun02
yochun02

スコア76

title CHANGED
File without changes
body CHANGED
@@ -1,5 +1,7 @@
1
- 以下の様に、車(Car)抽象クラスから各メーカーの車具象クラス(**Car)へ継承させているとき、case classを使っているのでグルトンオブジェクトを使ってnew を使わずにインスタンスを作りたいのですが、結局グルトンオブジェクトにも具象クラスでコンストラクタみたいに使っているメソッドを書かなければならず冗長になっています。何か他にスマートな書き方がありますでしょうか?
1
+ 以下の様に、車(Car)抽象クラスから各メーカーの車具象クラス(**Car)へ継承させているとき、case classを使っているのでパニオンオブジェクトを使ってnew を使わずにインスタンスを作りたいのですが、結局パニオンオブジェクトにも具象クラスでコンストラクタみたいに使っているメソッドを書かなければならず冗長になっています。何か他にスマートな書き方がありますでしょうか?
2
2
 
3
+ ##### 悩みどころ
4
+ 抽象クラスからoverrideしたcreateメソッドからインスタンスを作りたいが、コンパニオンオブジェクトのファクトリメソッドからインスタンスを作るとなるとこの定義がそもそも不要という。(やってることがおかしい?)
3
5
 
4
6
  ```scala
5
7