回答編集履歴
1
数値のブレ
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
|
-
|
166
|
+
|
46
|
-
|
47
|
-
```
|
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
|
-
|
207
|
+
このとき上記のままですと法令に不適合(コンパイルエラー)になります。
|
208
|
+
|
209
|
+
|
210
|
+
|
211
|
+
適合させるためには、以下のように設計を変更して法令(インターフェース)で決められたメソッドを実装する必要があります。
|
212
|
+
|
213
|
+
|
166
214
|
|
167
215
|
``` java
|
168
216
|
|
169
|
-
int
|
217
|
+
class Room implements 消防法, 建築基準法{
|
170
|
-
|
218
|
+
|
171
|
-
|
219
|
+
// 部屋の広さを返す関数
|
172
|
-
|
220
|
+
|
173
|
-
|
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
|
-
```
|
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
|
どうでしょうか?伝わりますでしょうか?
|