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

回答編集履歴

2

コード追加

2019/05/23 23:47

投稿

ozwk
ozwk

スコア13553

answer CHANGED
@@ -7,4 +7,99 @@
7
7
  あれば何もせずに済みます。
8
8
 
9
9
 
10
- なのでこのコードだと実感しづらいです。
10
+ なのでこのコードだと実感しづらいです。
11
+
12
+ ---
13
+
14
+ ```go
15
+ package main
16
+
17
+ import "fmt"
18
+
19
+
20
+
21
+ type Add struct {}
22
+ func (x Add) calculate(a int, b int) int { return a+b }
23
+
24
+ type Sub struct {}
25
+ func (x Sub) calculate(a int, b int) int { return a-b }
26
+
27
+ type Mul struct {}
28
+ func (x Mul) calculate(a int, b int) int { return a*b }
29
+
30
+ type Div struct {}
31
+ func (x Div) calculate(a int, b int) int { return a/b }
32
+
33
+
34
+ // 型によって作り分ける
35
+ func somethingNiceFunctionAdd(c Add, left int, right int) {
36
+ fmt.Println(c.calculate(left, right))
37
+ }
38
+ func somethingNiceFunctionSub(c Sub, left int, right int) {
39
+ fmt.Println(c.calculate(left, right))
40
+ }
41
+ func somethingNiceFunctionMul(c Mul, left int, right int) {
42
+ fmt.Println(c.calculate(left, right))
43
+ }
44
+ func somethingNiceFunctionDiv(c Div, left int, right int) {
45
+ fmt.Println(c.calculate(left, right))
46
+ }
47
+
48
+
49
+ func main() {
50
+ var a Add
51
+ var s Sub
52
+ var m Mul
53
+ var d Div
54
+
55
+ // 呼ぶ側も型によって使い分ける
56
+ somethingNiceFunctionAdd(a, 7, 2)
57
+ somethingNiceFunctionSub(s, 7, 2)
58
+ somethingNiceFunctionMul(m, 7, 2)
59
+ somethingNiceFunctionDiv(d, 7, 2)
60
+
61
+ }
62
+
63
+ ```
64
+
65
+
66
+ ```go
67
+ package main
68
+
69
+ import "fmt"
70
+
71
+ type Calc interface{
72
+ calculate(a int, b int) int
73
+ }
74
+
75
+ type Add struct {}
76
+ func (x Add) calculate(a int, b int) int { return a+b }
77
+
78
+ type Sub struct {}
79
+ func (x Sub) calculate(a int, b int) int { return a-b }
80
+
81
+ type Mul struct {}
82
+ func (x Mul) calculate(a int, b int) int { return a*b }
83
+
84
+ type Div struct {}
85
+ func (x Div) calculate(a int, b int) int { return a/b }
86
+
87
+ // ひとつでいい
88
+ func somethingNiceFunction(c Calc, left int, right int) {
89
+ fmt.Println(c.calculate(left, right))
90
+ }
91
+
92
+ func main() {
93
+ var a Add
94
+ var s Sub
95
+ var m Mul
96
+ var d Div
97
+
98
+ // 呼ぶ側も区別しなくていい
99
+ somethingNiceFunction(a, 7, 2)
100
+ somethingNiceFunction(s, 7, 2)
101
+ somethingNiceFunction(m, 7, 2)
102
+ somethingNiceFunction(d, 7, 2)
103
+
104
+ }
105
+ ```

1

修正

2019/05/23 23:47

投稿

ozwk
ozwk

スコア13553

answer CHANGED
@@ -1,4 +1,4 @@
1
- `Add, Sub, Mul, Div`を使う関数を書くとき(例えば計算結果を表示するだけ)
1
+ `Add, Sub, Mul, Div`のどれを使うかだけが違う関数を書くとき(例えば計算結果を表示するだけ)
2
2
  インターフェースがないと引数の型が違うだけの関数を4つ書きますが、
3
3
  インターフェースがあれば1つで済みます。
4
4