回答編集履歴

1

追記1(もうちょっと書いてみる)

2021/07/01 10:46

投稿

BeatStar
BeatStar

スコア4962

test CHANGED
@@ -75,3 +75,195 @@
75
75
 
76
76
 
77
77
  『**子で生成して、親で保持**』してみては?
78
+
79
+
80
+
81
+ ----
82
+
83
+
84
+
85
+ [追記1]
86
+
87
+
88
+
89
+ OOPの本質は『オブジェクトに管理や処理を任せる』にあると思います。
90
+
91
+
92
+
93
+ 上記で挙げたページのような感じで。
94
+
95
+
96
+
97
+ で、ポリモーフィズムは『継承しているから』とかそういうのではなく、
98
+
99
+
100
+
101
+ 『オブジェクトだけが知っている』という状態です。
102
+
103
+
104
+
105
+ たとえば、
106
+
107
+
108
+
109
+ ユーザ入力によって "+" が入力されたら足し算クラス、"-" が入力されたら引き算クラス……というそれぞれのクラスを生成して処理するとします。
110
+
111
+
112
+
113
+ 単純に考えれば、
114
+
115
+
116
+
117
+ ```Java
118
+
119
+ String user; // これに "+" とかが入っているとする
120
+
121
+
122
+
123
+ Addition a; // 足し算クラス
124
+
125
+ Sub s; // 引き算クラス
126
+
127
+ Mult m; // 掛け算クラス
128
+
129
+
130
+
131
+ // ユーザ入力によって生成するクラスを決定する
132
+
133
+ if( user.equals( "+" ) ){
134
+
135
+ a = new Addition( 10 );
136
+
137
+ }else if( user.equals( "-" ) ){
138
+
139
+ s = new Sub( 10 );
140
+
141
+ }else if( user.equals( "*" ) ){
142
+
143
+ m = new Multi( 10 );
144
+
145
+ }
146
+
147
+
148
+
149
+ int ans = 0;
150
+
151
+
152
+
153
+ // 処理!
154
+
155
+ if( user.equals( "+" ) ){
156
+
157
+ ans = a.calc( 2 );
158
+
159
+ }else if( user.equals( "-" ) ){
160
+
161
+ ans = s.calc( 2 );
162
+
163
+ }else ...
164
+
165
+ ```
166
+
167
+
168
+
169
+ のように、生成時はもちろん、処理時(メソッドを使っての処理とか) もif文で分岐させないといけません。
170
+
171
+
172
+
173
+ でも考えてみてください。
174
+
175
+
176
+
177
+ 『オブジェクトだけが対象データと処理方法を知っている』のだから、『オブジェクトに任せればいい』となりませんか?
178
+
179
+
180
+
181
+ そう、これがポリモーフィズム。
182
+
183
+
184
+
185
+ オーバーライドするなりして、『オブジェクトが知っている』状態にする。
186
+
187
+
188
+
189
+ こうすることで、Calculatorクラスを継承(あるいはインターフェースを実装でもいい) とすれば、
190
+
191
+
192
+
193
+ ```Java
194
+
195
+ String user; // これに "+" とかが入っているとする
196
+
197
+
198
+
199
+ Calculator c; // 計算系オブジェクト
200
+
201
+
202
+
203
+ // ユーザ入力によって生成するクラスを決定する
204
+
205
+ if( user.equals( "+" ) ){
206
+
207
+ c = new Addition( 10 );
208
+
209
+ }else if( user.equals( "-" ) ){
210
+
211
+ c = new Sub( 10 );
212
+
213
+ }else if( user.equals( "*" ) ){
214
+
215
+ c = new Multi( 10 );
216
+
217
+ }
218
+
219
+
220
+
221
+ /*
222
+
223
+ 処理!!!!
224
+
225
+ オブジェクトが対象データと処理方法を知っているため、
226
+
227
+ 処理や管理をオブジェクトに任せる
228
+
229
+ */
230
+
231
+ int ans = c.calc( 2 );
232
+
233
+ ```
234
+
235
+
236
+
237
+ と出来ます。
238
+
239
+
240
+
241
+ こうすることで、cは new で生成されたクラスのオブジェクトなので、オブジェクト自身が
242
+
243
+ 対象データと処理方法を知っています。
244
+
245
+
246
+
247
+ なので、『オブジェクトに任せる』ための機能というか、そういうのがポリモーフィズムです。
248
+
249
+ (オブジェクトそれぞれが処理方法を知っているため、『多様性』ができる)
250
+
251
+
252
+
253
+ クラスはこのオブジェクトのデータ構造(どういうデータや処理を持っているかとか)をコンパイラとかに提示するためのものです。
254
+
255
+
256
+
257
+ つまり、『オブジェクト指向の本質』である、『オブジェクト自身が対象データと処理方法を知っている』ことにより、『オブジェクトに任せる発想』というのがオブジェクト指向です。
258
+
259
+
260
+
261
+ そしてそれらを表現するためにクラスやら継承やらポリモーフィズムやらカプセル化やらがあるのです。
262
+
263
+
264
+
265
+ 参考文献(サイト): [よい子のC++(オブジェクト指向完全理解)](http://www.tcp-ip.or.jp/~ikken/cpp/)
266
+
267
+
268
+
269
+ 参考サイトはC++ですが、Javaとかでも発想自体は一緒です。