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