質問編集履歴
8
修正
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
修正
title
CHANGED
File without changes
|
body
CHANGED
@@ -3,7 +3,7 @@
|
|
3
3
|
##### 悩みどころ
|
4
4
|
抽象クラスからoverrideしたcreateメソッド(セッター)からインスタンスを作りたいが、コンパニオンオブジェクトのファクトリメソッドからインスタンスを作るとなるとこの(抽象クラスで用意した方の)定義がそもそも不要という。(やってることがおかしい?)
|
5
5
|
##### 所感
|
6
|
-
Car.manufacturerだけは具象クラスの名称に紐づくので、各具象クラスのインスタンスが作られた段階でセットされてほしい
|
6
|
+
Car.manufacturerだけは具象クラスの名称に紐づくので、各具象クラスのインスタンスが作られた段階で自動的にセットされてほしい(createでセットしたくない)ので分離しているからがめんどくささの原因か。
|
7
7
|
|
8
8
|
|
9
9
|
```scala
|
6
補足
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
修正
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 =
|
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 =
|
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
補足追加
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
内容修正
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
補足
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
補足
title
CHANGED
File without changes
|
body
CHANGED
@@ -1,5 +1,7 @@
|
|
1
|
-
以下の様に、車(Car)抽象クラスから各メーカーの車具象クラス(**Car)へ継承させているとき、case classを使っているので
|
1
|
+
以下の様に、車(Car)抽象クラスから各メーカーの車具象クラス(**Car)へ継承させているとき、case classを使っているのでコンパニオンオブジェクトを使ってnew を使わずにインスタンスを作りたいのですが、結局コンパニオンオブジェクトにも具象クラスでコンストラクタみたいに使っているメソッドを書かなければならず冗長になっています。何か他にスマートな書き方がありますでしょうか?
|
2
2
|
|
3
|
+
##### 悩みどころ
|
4
|
+
抽象クラスからoverrideしたcreateメソッドからインスタンスを作りたいが、コンパニオンオブジェクトのファクトリメソッドからインスタンスを作るとなるとこの定義がそもそも不要という。(やってることがおかしい?)
|
3
5
|
|
4
6
|
```scala
|
5
7
|
|