回答編集履歴

1

数値のブレ

2018/06/20 08:54

投稿

euledge
euledge

スコア2404

test CHANGED
@@ -32,101 +32,139 @@
32
32
 
33
33
  double getSize() {
34
34
 
35
+ return 6; // 6畳
36
+
37
+ }
38
+
39
+ }
40
+
41
+ ```
42
+
43
+ この設計図に従って **部屋の建築** を行いました。
44
+
45
+ ** これはJavaでいうとクラスからインスタンスを作成するということです **
46
+
47
+ ``` Java
48
+
49
+ // 6畳の部屋を作成する
50
+
51
+ Room myRoom = new Room();
52
+
53
+ ```
54
+
55
+
56
+
57
+ このクラス Roomはインタフェースを基にしてはいません。
58
+
59
+ この部屋にテレビを置く(拡張する)ためには以下のように **クラスの設計を変更** します。
60
+
61
+
62
+
63
+ ``` Java
64
+
65
+ // 部屋の設計図
66
+
67
+ class Room {
68
+
69
+ // 部屋の広さを返す関数
70
+
71
+ double getSize() {
72
+
73
+ return 6; // 6畳
74
+
75
+ }
76
+
77
+ // テレビを持っている
78
+
79
+ boolean hasTelevision() {
80
+
81
+ return true;
82
+
83
+ }
84
+
85
+ }
86
+
87
+ ```
88
+
89
+ この部屋の広さを6畳から8畳に (変更する) ためには既存 **メソッドの実装を変更** します。
90
+
91
+ ``` Java
92
+
93
+ // 部屋の設計図
94
+
95
+ class Room {
96
+
97
+ // 部屋の広さを返す関数
98
+
99
+ double getSize() {
100
+
101
+ return 8; // 8畳
102
+
103
+ }
104
+
105
+ }
106
+
107
+ ```
108
+
109
+
110
+
111
+ 上記は、当初 **想定されてなかったものでも突然になって変更・拡張する** という目的にかなうもので
112
+
113
+ 前のコメントはこのやり方のことを言っています。
114
+
115
+ > 「インターフェースが、実装されてないクラスやメソッドでは、突然になって変更・拡張することが可能なのか?」に対しては、
116
+
117
+ > 「可能です」という回答になります。
118
+
119
+
120
+
121
+ つまりクラスの設計を行う人が何を変更するかがわかっているのであればインタフェースがなくても変更も拡張もしてもよいのです。
122
+
123
+
124
+
125
+ ## インタフェースを使う場合
126
+
127
+ 部屋を作るうえでは、建築基準法や消防法といった法律があります。これをイメージしてほしいのですが下記のようになります。
128
+
129
+ ``` Java
130
+
131
+ interface 建築基準法 {
132
+
133
+ // 窓があること
134
+
135
+ boolean has窓();
136
+
137
+ }
138
+
139
+
140
+
141
+ // この部屋の設計図は建築基準法にのっとったものです
142
+
143
+ class Room implements 建築基準法{
144
+
145
+ // 部屋の広さを返す関数
146
+
147
+ double getSize() {
148
+
35
149
  return 3.3*6; // 約6畳
36
150
 
37
151
  }
38
152
 
153
+ @Overide
154
+
155
+ boolean has窓() {
156
+
157
+ return true;
158
+
39
- }
159
+ }
160
+
40
-
161
+ }
162
+
41
- ```
163
+ ```
42
-
164
+
43
- この設計図って **部屋の建築** 行いました。
165
+ 1年後法令が変更って消防法満たす必要が出てきました。
44
-
45
- ** これはJavaでいうとクラスからインスタンスを作成するということです **
166
+
46
-
47
- ``` Java
167
+ ``` java
48
-
49
- // 6畳の部屋を作成する
50
-
51
- Room myRoom = new Room();
52
-
53
- ```
54
-
55
-
56
-
57
- このクラス Roomはインタフェースを基にしてはいません。
58
-
59
- この部屋にテレビを置く(拡張する)ためには以下のように **クラスの設計を変更** します。
60
-
61
-
62
-
63
- ``` Java
64
-
65
- // 部屋の設計図
66
-
67
- class Room {
68
-
69
- // 部屋の広さを返す関数
70
-
71
- double getSize() {
72
-
73
- return 6; // 6畳
74
-
75
- }
76
-
77
- // テレビを持っている
78
-
79
- boolean hasTelevision() {
80
-
81
- return true;
82
-
83
- }
84
-
85
- }
86
-
87
- ```
88
-
89
- この部屋の広さを6畳から8畳に (変更する) ためには既存 **メソッドの実装を変更** します。
90
-
91
- ``` Java
92
-
93
- // 部屋の設計図
94
-
95
- class Room {
96
-
97
- // 部屋の広さを返す関数
98
-
99
- double getSize() {
100
-
101
- return 8; // 8畳
102
-
103
- }
104
-
105
- }
106
-
107
- ```
108
-
109
-
110
-
111
- 上記は、当初 **想定されてなかったものでも突然になって変更・拡張する** という目的にかなうもので
112
-
113
- 前のコメントはこのやり方のことを言っています。
114
-
115
- > 「インターフェースが、実装されてないクラスやメソッドでは、突然になって変更・拡張することが可能なのか?」に対しては、
116
-
117
- > 「可能です」という回答になります。
118
-
119
-
120
-
121
- つまりクラスの設計を行う人が何を変更するかがわかっているのであればインタフェースがなくても変更も拡張もしてもよいのです。
122
-
123
-
124
-
125
- ## インタフェースを使う場合
126
-
127
- 部屋を作るうえでは、建築基準法や消防法といった法律があります。これをイメージしてほしいのですが下記のようになります。
128
-
129
- ``` Java
130
168
 
131
169
  interface 建築基準法 {
132
170
 
@@ -136,11 +174,15 @@
136
174
 
137
175
  }
138
176
 
139
-
177
+ interface 消防法 {
140
-
178
+
141
- // 部屋の計図は建築基準法にのっとったものです
179
+ // 消火器の設置が義務付けられている
180
+
142
-
181
+ boolean has消火器();
182
+
183
+ }
184
+
143
- class Room implements 建築基準法{
185
+ class Room implements 消防法, 建築基準法{
144
186
 
145
187
  // 部屋の広さを返す関数
146
188
 
@@ -150,7 +192,7 @@
150
192
 
151
193
  }
152
194
 
153
- @Overide
195
+ @Overide
154
196
 
155
197
  boolean has窓() {
156
198
 
@@ -162,17 +204,53 @@
162
204
 
163
205
  ```
164
206
 
165
- 1年後法令が変更になって消防法を満た必要が出てきました
207
+ このとき上記のままですと法令に不適合(コンパイルエラー)にります。
208
+
209
+
210
+
211
+ 適合させるためには、以下のように設計を変更して法令(インターフェース)で決められたメソッドを実装する必要があります。
212
+
213
+
166
214
 
167
215
  ``` java
168
216
 
169
- interface 建築基準法 {
217
+ class Room implements 消防法, 建築基準法{
170
-
218
+
171
- // 窓があること
219
+ // 部屋の広さを返す関数
172
-
220
+
173
- boolean has窓();
221
+ double getSize() {
222
+
174
-
223
+ return 3.3*6; // 約6畳
224
+
175
- }
225
+ }
226
+
227
+ @Overide
228
+
229
+ boolean has窓() {
230
+
231
+ return true;
232
+
233
+ }
234
+
235
+ @Overide
236
+
237
+ boolean has消火器() {
238
+
239
+ return true;
240
+
241
+ }
242
+
243
+ }
244
+
245
+ ```
246
+
247
+
248
+
249
+ また暫くして消防法が変更になり火災報知機の設置が義務付けられました。
250
+
251
+ ** これはJavaでいうとインタフェースにメソッド定義を追加するということです **
252
+
253
+ ``` Java
176
254
 
177
255
  interface 消防法 {
178
256
 
@@ -180,7 +258,21 @@
180
258
 
181
259
  boolean has消火器();
182
260
 
261
+ // 火災報知機の設置が義務付けられている
262
+
263
+ boolean has火災報知機();
264
+
183
- }
265
+ }
266
+
267
+ ```
268
+
269
+
270
+
271
+ このときもクラスRoomは不適合(コンパイルエラー)になりますので適合させるために部屋の設計を変更します。
272
+
273
+
274
+
275
+ ``` Java
184
276
 
185
277
  class Room implements 消防法, 建築基準法{
186
278
 
@@ -200,19 +292,33 @@
200
292
 
201
293
  }
202
294
 
295
+ @Overide
296
+
297
+ boolean has消火器() {
298
+
299
+ return true;
300
+
203
- }
301
+ }
302
+
204
-
303
+ @Overide
304
+
305
+ boolean has火災報知機() {
306
+
307
+ return true;
308
+
309
+ }
310
+
311
+ }
312
+
205
- ```
313
+ ```
206
-
207
- このとき上記のままですと法令に不適合(コンパイルエラー)になります。
314
+
208
-
209
-
210
-
211
- 適合させるためには、以下のように設計を変更て法令(インタフェース)で決められたメソッドを実装する必要あります。
315
+ のように法令(インタフェース)に沿った設計(クラス)の部屋ですが、設計者がベランダ追加たいと思った場合はインタフェースに追加しなくても設計(クラス)に追加すること可能です。
316
+
212
-
317
+ (ベランダがなければならないという法令はないので...)
213
-
214
-
318
+
319
+
320
+
215
- ``` java
321
+ ``` Java
216
322
 
217
323
  class Room implements 消防法, 建築基準法{
218
324
 
@@ -224,6 +330,12 @@
224
330
 
225
331
  }
226
332
 
333
+ boolean hasベランダ() {
334
+
335
+ return true;
336
+
337
+ }
338
+
227
339
  @Overide
228
340
 
229
341
  boolean has窓() {
@@ -240,66 +352,6 @@
240
352
 
241
353
  }
242
354
 
243
- }
244
-
245
- ```
246
-
247
-
248
-
249
- また暫くして消防法が変更になり火災報知機の設置が義務付けられました。
250
-
251
- ** これはJavaでいうとインタフェースにメソッド定義を追加するということです **
252
-
253
- ``` Java
254
-
255
- interface 消防法 {
256
-
257
- // 消火器の設置が義務付けられている
258
-
259
- boolean has消火器();
260
-
261
- // 火災報知機の設置が義務付けられている
262
-
263
- boolean has火災報知機();
264
-
265
- }
266
-
267
- ```
268
-
269
-
270
-
271
- このときもクラスRoomは不適合(コンパイルエラー)になりますので適合させるために部屋の設計を変更します。
272
-
273
-
274
-
275
- ``` Java
276
-
277
- class Room implements 消防法, 建築基準法{
278
-
279
- // 部屋の広さを返す関数
280
-
281
- double getSize() {
282
-
283
- return 3.3*6; // 約6畳
284
-
285
- }
286
-
287
- @Overide
288
-
289
- boolean has窓() {
290
-
291
- return true;
292
-
293
- }
294
-
295
- @Overide
296
-
297
- boolean has消火器() {
298
-
299
- return true;
300
-
301
- }
302
-
303
355
  @Overide
304
356
 
305
357
  boolean has火災報知機() {
@@ -312,58 +364,6 @@
312
364
 
313
365
  ```
314
366
 
315
- このように法令(インタフェース)に沿った設計(クラス)の部屋ですが、設計者がベランダを追加したいと思った場合はインタフェースに追加しなくても設計(クラス)に追加することが可能です。
316
-
317
- (ベランダがなければならないという法令はないので...)
318
-
319
-
320
-
321
- ``` Java
322
-
323
- class Room implements 消防法, 建築基準法{
324
-
325
- // 部屋の広さを返す関数
326
-
327
- double getSize() {
328
-
329
- return 3.3*6; // 約6畳
330
-
331
- }
332
-
333
- boolean hasベランダ() {
334
-
335
- return true;
336
-
337
- }
338
-
339
- @Overide
340
-
341
- boolean has窓() {
342
-
343
- return true;
344
-
345
- }
346
-
347
- @Overide
348
-
349
- boolean has消火器() {
350
-
351
- return true;
352
-
353
- }
354
-
355
- @Overide
356
-
357
- boolean has火災報知機() {
358
-
359
- return true;
360
-
361
- }
362
-
363
- }
364
-
365
- ```
366
-
367
367
 
368
368
 
369
369
  どうでしょうか?伝わりますでしょうか?