回答編集履歴

6

プログラムの修正

2017/01/09 10:01

投稿

seastar3
seastar3

スコア2285

test CHANGED
@@ -164,13 +164,15 @@
164
164
 
165
165
  public String hiku(String mojiretsu) {
166
166
 
167
- if (kotae.matches(".*" + mojiretsu + ".*"))
167
+ if (kotae.matches(".*" + mojiretsu + ".*"))
168
168
 
169
169
  return kotae = kotae.replaceAll(mojiretsu, "");
170
170
 
171
171
  else
172
172
 
173
- return "'" + kotae + "'の中には、\n'" + mojiretsu + "'は見当たらないので、引けません。";
173
+ System.out.println("'" + kotae + "'の中には、\n'" + mojiretsu + "'は見当たらないので、引けません。");
174
+
175
+ return "";
174
176
 
175
177
  }
176
178
 
@@ -206,9 +208,13 @@
206
208
 
207
209
  d2.tasu("寿限無、寿限無、");
208
210
 
211
+ d2.tasu("五劫のすり切れ");
212
+
209
- System.out.println("最初の加算のd2の答は「" + d2.tasu("五劫のすり切れ") + "」です。");
213
+ System.out.println("最初の加算のd2の答は「" + d2.tasu("") + "」です。");
214
+
210
-
215
+ d2.hiku("海砂利水魚");
216
+
211
- System.out.println("つぎの加算のd2の答は「" + d2.hiku("海砂利水魚") + "」です。");
217
+ System.out.println("つぎの加算のd2の答は「" + d2.tasu("") + "」です。");
212
218
 
213
219
  }
214
220
 

5

回答の詳細化

2017/01/09 10:01

投稿

seastar3
seastar3

スコア2285

test CHANGED
@@ -2,104 +2,236 @@
2
2
 
3
3
  例えば、電卓とは計算できて答を表示するものと当然のように分かっていますが、各電卓メーカーは各自が具体的な製品を製作し世に出します。つまり、抽象的な電卓はクラスにあたり、各社の製品はインスタンスにあたります。
4
4
 
5
- 実際に加減算機能のみの電卓オブジェクトを定義します。変数はkotaeのみ、メソッドはコンストラクタも表示メソッドも省いたtasuとhikuの2つだけです。
6
-
7
-
8
-
9
- Dentaku1.java
10
-
11
- ```Java
12
-
13
- public class Dentaku1 {
14
-
15
- Double kotae = 0.0;
16
-
17
- public Double tasu(Double kazu) {
18
-
19
- return kotae += kazu;
20
-
21
- }
22
-
23
- public Double hiku(Double kazu) {
24
-
25
- return kotae -= kazu;
26
-
27
- }
28
-
29
- }
30
-
31
- ```
32
-
33
- このDentaku1から2つの電卓sharkとcasiyaを実体化し、(5+5)-(1+1)を計算させます。
34
-
35
- Dentaku_Sousa1.java
36
-
37
- ```Java
38
-
39
- // 2つの電卓オブジェクトを使った計算処理 (5.0+5.0)-(1.0+1.0)
40
-
41
- public class Dentaku_Sousa1 {
42
-
43
- public static void main( String args[] ) {
44
-
45
- // シャーク電卓の足し算処理
46
-
47
- Dentaku1 shark = new Dentaku1();
48
-
49
- shark.tasu(5.0);
50
-
51
- shark.tasu(5.0);
52
-
53
- System.out.println("シャーク電卓の今の答は" + shark.tasu(0.0));
54
-
55
-
56
-
57
- // 菓子屋電卓の足し算処理
58
-
59
- Dentaku1 casiya = new Dentaku1();
60
-
61
- casiya.tasu(1.0);
62
-
63
- casiya.tasu(1.0);
64
-
65
- System.out.println("菓子屋電卓の今の答は" + casiya.tasu(0.0));
66
-
67
-
68
-
69
- // 二つ電卓のの差の計算出力処理 答はシャーク電卓で計算し表示させる。
70
-
71
- shark.hiku(casiya.tasu(0.0));
72
-
73
- System.out.println("菓子屋電卓の答とシャーク電卓の答の差は" + shark.tasu(0.0));
74
-
75
- }
76
-
77
- }
78
-
79
- ```
80
-
81
- 以上にように一度規定した電卓クラスを = new の演算式により名前をつけて操作できるように実体化し、目的通りに操るのがOOPの操作の概略です。
82
-
83
- この応用として、加減算のみの電卓Dentaku1から乗除算機能を追加したDentaku2オブジェクトを再定義し、インスタンス化して操ったり、メモリー機能を追加して操ったりできます。そこまでできるようになれば、OOPの基礎は確立できたことになるでしょう。
84
-
85
-
86
-
87
- OOP考え方展開すれば、自動車も携帯電話も電子レンジも扇風機も同様です。人間でも企業でもスポーツチームでもオブジェクト指向的に考えると、一般的な通念上の定義と実際的な事物と分けて認識できます。それが、抽象的オブジェクトと具体的なインスタンスとの違いです。
88
-
89
- プログラマーは自分で作りたい機能のクラスを設定して、そのクラスに個々の名前をつけて操ります。ゲームのキャラだったり、セキュリティ機能だったり、画面上の個々のウインドウだったりして、みんなオブジェクトを使っています。
90
-
91
- 使うだけならば抽象的オブジェクトに関わる必要はありませんが、自分で何らかの機能を設定して、いくつも動かしたり、改良版を開発したりするのなら、抽象的クラスの設定とインスタンス化と継承などを理解する必要があります。
92
-
93
- 拙サイトの[オブジェクト指向プログラミングの指導について](http://wp.me/p7SU0v-1P)がオブジェクト指向プログラムについて私なりにまとめたことです。最後の方に出てくるウインドウズ版の[オブジェクト指向プログラミング入門キット](http://seastar.la.coocan.jp/download/oop-practice-kit1.lzh)でウインドウオブジェクトを操作してみると、実感できるのではないでしょうか。
94
-
95
-
96
-
97
- 意外と反響が大きいようで、回答が散らばると混乱しますから、ここに別の観点からの説明も記しておきます。
98
-
99
- 抽象的オブジェクトは設計図であり、実体化されたインスタンスはメモリー上に書き込み場所を確保した構築物です。例えば分譲住宅の設計図は図面の上に存在し形になってはいませんが、1mmもゆるがせにできない規格です。そして、分譲地に複数棟の住宅が建てた後は、それぞれの住宅は番地も住む人も壁の色もまちまちに使われます。
100
-
101
- この考え方と同じく、クラスを=new演算で実体化するということは、そのクラスが設計した位置と分量のプログラムを、メモリー上のインスタンス名で起点を決めた番地から埋め込みメモリーを占有します。変数の番地もメソッドの開始番地も、インスタンス名でのポインタを基準に相対的に確定されます。これはあたかも各分譲住宅の間取りが一緒なのと同様です。
102
-
103
- 抽象的クラスの役割とインスタンス化ということを、設計図と分譲住宅の例で説明すれば、以上のようになります。
104
-
105
-
5
+ 実際に加える機能と取り除く機能を用意した電卓オブジェクトを定義します。変数はkotaeのみ、メソッドはコンストラクタも表示メソッドも省いたtasuとhikuの2つだけです。
6
+
7
+
8
+
9
+ Dentaku0.java
10
+
11
+ ```Java
12
+
13
+ public abstract class Dentaku0<T> {
14
+
15
+ private Object kotae;
16
+
17
+ public <T> void tasu(){};
18
+
19
+ public <T> void hiku(){};
20
+
21
+ }
22
+
23
+ ```
24
+
25
+ この抽象クラスの電卓は、整数用なのか実数用なのかあいまいな電卓です。
26
+
27
+ このDentaku0から整数計算用の電卓と実数計算用の電卓を派生させ、それぞれ操作します。
28
+
29
+ Dentaku_seisuu.java
30
+
31
+ ```Java
32
+
33
+ public class Dentaku_seisuu<D> extends Dentaku0<D> {
34
+
35
+ int kotae = 0;
36
+
37
+ public int tasu(int kazu) {
38
+
39
+ return kotae += kazu;
40
+
41
+ }
42
+
43
+ public int hiku(int kazu) {
44
+
45
+ return kotae -= kazu;
46
+
47
+ }
48
+
49
+ }
50
+
51
+ ```
52
+
53
+ この整数用電卓を操作する見本プログラムが次コードです。
54
+
55
+ Dentaku_seisuu_Sousa1.java
56
+
57
+ ```Java
58
+
59
+ public class Dentaku_seisuu_Sousa1 {
60
+
61
+ public static void main( String args[] ) {
62
+
63
+ Dentaku_seisuu<Object> d1 = new Dentaku_seisuu<Object>();
64
+
65
+ d1.tasu(5);
66
+
67
+ d1.tasu(5);
68
+
69
+ System.out.println("d1の答は" + d1.tasu(0));
70
+
71
+
72
+
73
+ Dentaku_seisuu<Object> d2 = new Dentaku_seisuu<Object>();
74
+
75
+ d2.tasu(1);
76
+
77
+ d2.tasu(1);
78
+
79
+ System.out.println("d2の答は" + d2.tasu(0));
80
+
81
+ }
82
+
83
+ }
84
+
85
+ ```
86
+
87
+ また、実数用電卓Denkatu0クラスから派生させれば、
88
+
89
+ ```Java
90
+
91
+ public class Dentaku_jissuu<D> extends Dentaku0<D> {
92
+
93
+ double kotae = 0.0;
94
+
95
+ public double tasu(double kazu) {
96
+
97
+ return kotae += kazu;
98
+
99
+ }
100
+
101
+ public double hiku(double kazu) {
102
+
103
+ return kotae -= kazu;
104
+
105
+ }
106
+
107
+ }
108
+
109
+ ```
110
+
111
+ Denntaku_jisuuクラスを操る見本のコードが、
112
+
113
+ Dentaku_jissuu_Sousa1
114
+
115
+ ```Java
116
+
117
+ public class Dentaku_jissuu_Sousa1 {
118
+
119
+ public static void main( String args[] ) {
120
+
121
+ Dentaku_jissuu<Object> d1 = new Dentaku_jissuu<Object>();
122
+
123
+ d1.tasu(5.0);
124
+
125
+ d1.tasu(5.0);
126
+
127
+ System.out.println("d1の答は" + d1.tasu(0.0));
128
+
129
+
130
+
131
+ Dentaku_jissuu<Object> d2 = new Dentaku_jissuu<Object>();
132
+
133
+ d2.tasu(1.0);
134
+
135
+ d2.tasu(1.0);
136
+
137
+ System.out.println("d2の答は" + d2.tasu(0.0));
138
+
139
+ }
140
+
141
+ }
142
+
143
+ ```
144
+
145
+ と記述できます。一通りeclipseで検証済みのコードです。
146
+
147
+ さて、このように数値の型ごとに部分部分でコードがかわってしまうような場合に、抽象クラスを決定しそれを作り込んでいくのです。
148
+
149
+ もう一つ文字列の足し算と引き算を実装したDentaku_mojiretsuクラスを書いてみました。足し算は単純に引数の文字列を継ぎ足すだけですが、引き算は、引数がオブジェクト内にあれば抜き去り、なければ書き換えずにエラーメッセージを戻します。
150
+
151
+ Dentaku_mojiretsu.java
152
+
153
+ ```Java
154
+
155
+ public class Dentaku_mojiretsu<D> extends Dentaku0<D> {
156
+
157
+ String kotae = "";
158
+
159
+ public String tasu(String mojiretsu) {
160
+
161
+ return kotae += mojiretsu;
162
+
163
+ }
164
+
165
+ public String hiku(String mojiretsu) {
166
+
167
+ if (kotae.matches(".*" + mojiretsu + ".*"))
168
+
169
+ return kotae = kotae.replaceAll(mojiretsu, "");
170
+
171
+ else
172
+
173
+ return "'" + kotae + "'の中には、\n'" + mojiretsu + "'は見当たらないので、引けません。";
174
+
175
+ }
176
+
177
+ }
178
+
179
+ ```
180
+
181
+ この文字列加工用のDentaku_mojiretsuクラスを操る見本が次のコードです。
182
+
183
+ Dentaku_mojiretsu_Sousa1.java
184
+
185
+ ```Java
186
+
187
+ public class Dentaku_mojiretsu_Sousa1 {
188
+
189
+ public static void main( String args[] ) {
190
+
191
+ Dentaku_mojiretsu<Object> d1 = new Dentaku_mojiretsu<Object>();
192
+
193
+ d1.tasu("明けまして");
194
+
195
+ d1.tasu("おめでとうございます。");
196
+
197
+ System.out.println("最初の加算のd1の答は「" + d1.tasu("") + "」です。");
198
+
199
+ d1.hiku("ございます");
200
+
201
+ System.out.println("つぎの加算のd1の答は「" + d1.tasu("") + "」です。");
202
+
203
+
204
+
205
+ Dentaku_mojiretsu<Object> d2 = new Dentaku_mojiretsu<Object>();
206
+
207
+ d2.tasu("寿限無、寿限無、");
208
+
209
+ System.out.println("最初の加算のd2の答は「" + d2.tasu("五劫のすり切れ") + "」です。");
210
+
211
+ System.out.println("つぎの加算のd2の答は「" + d2.hiku("海砂利水魚") + "」です。");
212
+
213
+ }
214
+
215
+ }
216
+
217
+ ```
218
+
219
+ このように文字列での足したり引いたりする操作を実装することもあるわけです。
220
+
221
+ 他にも、日付の加減算、時刻の加減算、画像の加減算、角度の加減算などとさまざまな派生処理が起こりえます。後手後手の作業で、最初に作った整数用電卓をオーバーライドしてクラスを多様化したり、多態性を活用して引数を違えたメソッドを並べておくこともあることでしょう。
222
+
223
+ ともかく、ある抽象的な機能を特定のメソッドや変数で定義しておくと派生事項が膨らんでも見通しが良くなります。
224
+
225
+
226
+
227
+ 抽象的オブジェクトとその派生オブジェクトとの関係を、マンションの間取りとリフォームした部屋として例えたら、部屋の大きさや窓の位置や水回りや柱の大きさや位置は事前に決まっていてこれが抽象的オブジェクトにあたります。そして、入居する人が住居用かオフィス用か押し入れ用かなど用途によって、壁の色や間取りの変更や風呂の特注などのリクエストを取り入れカスタマイズされた部屋の図面が派生クラスに当たります。そして入居可能になった各部屋がインスタンスに当たります。
228
+
229
+
230
+
231
+ 今回は複数のマイナス評価もいただき、正直焦りましたが、自分なりにOOPの理解が深まり、Dentaku0クラス以下の教材の蓄積ができたので実に勉強になりました。時刻計算用の電卓の実装などまた時間があったら取り組んでみます。
232
+
233
+
234
+
235
+
236
+
237
+

4

説明の訂正

2017/01/09 06:03

投稿

seastar3
seastar3

スコア2285

test CHANGED
@@ -96,9 +96,9 @@
96
96
 
97
97
  意外と反響が大きいようで、回答が散らばると混乱しますから、ここに別の観点からの説明も記しておきます。
98
98
 
99
- 抽象的オブジェクトは設計図であり、実体化されたインスタンスはメモリー上に書き込み場所を確保した構築物です。例えば分譲住宅の設計図は図面の上に存在し形になってはいませんが、1mmもゆるがせにできない規格です。そして、分譲地に複数棟の住宅が建て、それぞれの住宅は番地も住む人も違って住まれます。
99
+ 抽象的オブジェクトは設計図であり、実体化されたインスタンスはメモリー上に書き込み場所を確保した構築物です。例えば分譲住宅の設計図は図面の上に存在し形になってはいませんが、1mmもゆるがせにできない規格です。そして、分譲地に複数棟の住宅が建てた後は、それぞれの住宅は番地も住む人も壁の色もちまちに使われます。
100
100
 
101
- この考え方と同じく、クラスを=new演算で実体化するということは、メモリー上にインスタンス名で起点を決めたそのクラスが設計した位置と分量のプログラム埋め込まれます。変数の番地もメソッドの開始番地も相対的に確定されます。これはあたかも各分譲住宅の間取りが一緒なのと同様です。
101
+ この考え方と同じく、クラスを=new演算で実体化するということは、そのクラスが設計した位置と分量のプログラムを、メモリー上のインスタンス名で起点を決めた番地から埋め込みメモリーを占有します。変数の番地もメソッドの開始番地も、インスタンス名でのポインタを基準に相対的に確定されます。これはあたかも各分譲住宅の間取りが一緒なのと同様です。
102
102
 
103
103
  抽象的クラスの役割とインスタンス化ということを、設計図と分譲住宅の例で説明すれば、以上のようになります。
104
104
 

3

脱字の追加

2017/01/08 08:20

投稿

seastar3
seastar3

スコア2285

test CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  例えば、電卓とは計算できて答を表示するものと当然のように分かっていますが、各電卓メーカーは各自が具体的な製品を製作し世に出します。つまり、抽象的な電卓はクラスにあたり、各社の製品はインスタンスにあたります。
4
4
 
5
- 実際に加減算機能のみの電卓オブジェクトを定義します。変数はktaeのみ、メソッドはコンストラクタも表示メソッドも省いたtasuとhikuの2つだけです。
5
+ 実際に加減算機能のみの電卓オブジェクトを定義します。変数はkotaeのみ、メソッドはコンストラクタも表示メソッドも省いたtasuとhikuの2つだけです。
6
6
 
7
7
 
8
8
 

2

説明の補足

2017/01/08 08:10

投稿

seastar3
seastar3

スコア2285

test CHANGED
@@ -2,10 +2,104 @@
2
2
 
3
3
  例えば、電卓とは計算できて答を表示するものと当然のように分かっていますが、各電卓メーカーは各自が具体的な製品を製作し世に出します。つまり、抽象的な電卓はクラスにあたり、各社の製品はインスタンスにあたります。
4
4
 
5
+ 実際に加減算機能のみの電卓オブジェクトを定義します。変数はktaeのみ、メソッドはコンストラクタも表示メソッドも省いたtasuとhikuの2つだけです。
6
+
7
+
8
+
9
+ Dentaku1.java
10
+
11
+ ```Java
12
+
13
+ public class Dentaku1 {
14
+
15
+ Double kotae = 0.0;
16
+
17
+ public Double tasu(Double kazu) {
18
+
19
+ return kotae += kazu;
20
+
21
+ }
22
+
23
+ public Double hiku(Double kazu) {
24
+
25
+ return kotae -= kazu;
26
+
27
+ }
28
+
29
+ }
30
+
31
+ ```
32
+
33
+ このDentaku1から2つの電卓sharkとcasiyaを実体化し、(5+5)-(1+1)を計算させます。
34
+
35
+ Dentaku_Sousa1.java
36
+
37
+ ```Java
38
+
39
+ // 2つの電卓オブジェクトを使った計算処理 (5.0+5.0)-(1.0+1.0)
40
+
41
+ public class Dentaku_Sousa1 {
42
+
5
- 自動車も携帯電話も電子レンジも扇風機も同様です。動物でも企業でも同様に考えられます。
43
+ public static void main( String args[] ) {
44
+
45
+ // シャーク電卓の足し算処理
46
+
47
+ Dentaku1 shark = new Dentaku1();
48
+
49
+ shark.tasu(5.0);
50
+
51
+ shark.tasu(5.0);
52
+
53
+ System.out.println("シャーク電卓の今の答は" + shark.tasu(0.0));
54
+
55
+
56
+
57
+ // 菓子屋電卓の足し算処理
58
+
59
+ Dentaku1 casiya = new Dentaku1();
60
+
61
+ casiya.tasu(1.0);
62
+
63
+ casiya.tasu(1.0);
64
+
65
+ System.out.println("菓子屋電卓の今の答は" + casiya.tasu(0.0));
66
+
67
+
68
+
69
+ // 二つの電卓の答の差の計算出力処理 答はシャーク電卓で計算し表示させる。
70
+
71
+ shark.hiku(casiya.tasu(0.0));
72
+
73
+ System.out.println("菓子屋電卓の答とシャーク電卓の答の差は" + shark.tasu(0.0));
74
+
75
+ }
76
+
77
+ }
78
+
79
+ ```
80
+
81
+ 以上にように一度規定した電卓クラスを = new の演算式により名前をつけて操作できるように実体化し、目的通りに操るのがOOPの操作の概略です。
82
+
83
+ この応用として、加減算のみの電卓Dentaku1から乗除算機能を追加したDentaku2オブジェクトを再定義し、インスタンス化して操ったり、メモリー機能を追加して操ったりできます。そこまでできるようになれば、OOPの基礎は確立できたことになるでしょう。
84
+
85
+
86
+
87
+ OOPの考え方を展開すれば、自動車も携帯電話も電子レンジも扇風機も同様です。人間でも企業でもスポーツチームでもオブジェクト指向的に考えると、一般的な通念上の定義と実際的な事物と分けて認識できます。それが、抽象的オブジェクトと具体的なインスタンスとの違いです。
6
88
 
7
89
  プログラマーは自分で作りたい機能のクラスを設定して、そのクラスに個々の名前をつけて操ります。ゲームのキャラだったり、セキュリティ機能だったり、画面上の個々のウインドウだったりして、みんなオブジェクトを使っています。
8
90
 
9
91
  使うだけならば抽象的オブジェクトに関わる必要はありませんが、自分で何らかの機能を設定して、いくつも動かしたり、改良版を開発したりするのなら、抽象的クラスの設定とインスタンス化と継承などを理解する必要があります。
10
92
 
11
- 拙サイトの[オブジェクト指向プログラミングの指導について](http://wp.me/p7SU0v-1P)が長年独学でオブジェクト指向プログラムを勉強し分かったことのまとめです。最後の方に出てくるウインドウズ版の[オブジェクト指向プログラミング入門キット](http://seastar.la.coocan.jp/download/oop-practice-kit1.lzh)でウインドウオブジェクトを操作してみると、実感できるのではないでしょうか。
93
+ 拙サイトの[オブジェクト指向プログラミングの指導について](http://wp.me/p7SU0v-1P)がオブジェクト指向プログラムについ私なりにまとめたことです。最後の方に出てくるウインドウズ版の[オブジェクト指向プログラミング入門キット](http://seastar.la.coocan.jp/download/oop-practice-kit1.lzh)でウインドウオブジェクトを操作してみると、実感できるのではないでしょうか。
94
+
95
+
96
+
97
+ 意外と反響が大きいようで、回答が散らばると混乱しますから、ここに別の観点からの説明も記しておきます。
98
+
99
+ 抽象的オブジェクトは設計図であり、実体化されたインスタンスはメモリー上に書き込み場所を確保した構築物です。例えば分譲住宅の設計図は図面の上に存在し形になってはいませんが、1mmもゆるがせにできない規格です。そして、分譲地に複数棟の住宅が建てば、それぞれの住宅は番地も住む人も違って住まれます。
100
+
101
+ この考え方と同じく、クラスを=new演算で実体化するということは、メモリー上にインスタンス名で起点を決めたそのクラスが設計した位置と分量のプログラムが埋め込まれます。変数の番地もメソッドの開始番地も相対的に確定されます。これはあたかも各分譲住宅の間取りが一緒なのと同様です。
102
+
103
+ 抽象的クラスの役割とインスタンス化ということを、設計図と分譲住宅の例で説明すれば、以上のようになります。
104
+
105
+

1

表現の訂正

2017/01/08 08:01

投稿

seastar3
seastar3

スコア2285

test CHANGED
@@ -8,4 +8,4 @@
8
8
 
9
9
  使うだけならば抽象的オブジェクトに関わる必要はありませんが、自分で何らかの機能を設定して、いくつも動かしたり、改良版を開発したりするのなら、抽象的クラスの設定とインスタンス化と継承などを理解する必要があります。
10
10
 
11
- 拙サイトの[オブジェクト指向プログラミングの指導について](http://wp.me/p7SU0v-1P)が長年独学でオブジェクト指向プログラムを勉強して分かったことのまとめです。最後の方に出てくるウインドウズ版の[オブジェクト指向プログラミング入門キット](http://seastar.la.coocan.jp/download/oop-practice-kit1.lzh)でウインドウオブジェクトを操作してみると、実感できるのではないでしょうか。
11
+ 拙サイトの[オブジェクト指向プログラミングの指導について](http://wp.me/p7SU0v-1P)が長年独学でオブジェクト指向プログラムを勉強して分かったことのまとめです。最後の方に出てくるウインドウズ版の[オブジェクト指向プログラミング入門キット](http://seastar.la.coocan.jp/download/oop-practice-kit1.lzh)でウインドウオブジェクトを操作してみると、実感できるのではないでしょうか。