teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

6

プログラムの修正

2017/01/09 10:01

投稿

seastar3
seastar3

スコア2287

answer CHANGED
@@ -81,10 +81,11 @@
81
81
  return kotae += mojiretsu;
82
82
  }
83
83
  public String hiku(String mojiretsu) {
84
- if (kotae.matches(".*" + mojiretsu + ".*"))
84
+ if (kotae.matches(".*" + mojiretsu + ".*"))
85
85
  return kotae = kotae.replaceAll(mojiretsu, "");
86
86
  else
87
- return "'" + kotae + "'の中には、\n'" + mojiretsu + "'は見当たらないので、引けません。";
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.hiku("海砂利水魚") + "」です。");
109
+ System.out.println("つぎの加算のd2の答は「" + d2.tasu("") + "」です。");
107
110
  }
108
111
  }
109
112
  ```

5

回答の詳細化

2017/01/09 10:01

投稿

seastar3
seastar3

スコア2287

answer CHANGED
@@ -1,52 +1,118 @@
1
1
  オブジェクトは道具の一般的な概念です。
2
2
  例えば、電卓とは計算できて答を表示するものと当然のように分かっていますが、各電卓メーカーは各自が具体的な製品を製作し世に出します。つまり、抽象的な電卓はクラスにあたり、各社の製品はインスタンスにあたります。
3
- 実際に加減算機能のみの電卓オブジェクトを定義します。変数はkotaeのみ、メソッドはコンストラクタも表示メソッドも省いたtasuとhikuの2つだけです。
3
+ 実際に加える機能と取り除く機能を用意した電卓オブジェクトを定義します。変数はkotaeのみ、メソッドはコンストラクタも表示メソッドも省いたtasuとhikuの2つだけです。
4
4
 
5
- Dentaku1.java
5
+ Dentaku0.java
6
6
  ```Java
7
- public class Dentaku1 {
7
+ public abstract class Dentaku0<T> {
8
- Double kotae = 0.0;
8
+ private Object kotae;
9
- public Double tasu(Double kazu) {
9
+ public <T> void tasu(){};
10
- return kotae += kazu;
11
- }
12
- public Double hiku(Double kazu) {
10
+ public <T> void hiku(){};
13
- return kotae -= kazu;
14
- }
15
11
  }
16
12
  ```
13
+ この抽象クラスの電卓は、整数用なのか実数用なのかあいまいな電卓です。
17
- このDentaku1から2つの電卓sharkcasiyaを体化し、(5+5)-(1+1)を計算させます。
14
+ このDentaku0から整数計算用の電卓と実計算用の電卓を派生させ、それぞれ操作します。
18
- Dentaku_Sousa1.java
15
+ Dentaku_seisuu.java
19
16
  ```Java
20
- // 2つの電卓オブジェクトを使った計算処理 (5.0+5.0)-(1.0+1.0)
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 Dentaku_Sousa1 {
30
+ public class Dentaku_seisuu_Sousa1 {
22
- public static void main( String args[] ) {
31
+ public static void main( String args[] ) {
23
- // シャーク電卓の足し算処理
24
- Dentaku1 shark = new Dentaku1();
32
+ Dentaku_seisuu<Object> d1 = new Dentaku_seisuu<Object>();
25
- shark.tasu(5.0);
33
+ d1.tasu(5);
26
- shark.tasu(5.0);
34
+ d1.tasu(5);
27
- System.out.println("シャーク電卓今の答は" + shark.tasu(0.0));
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
- shark.hiku(casiya.tasu(0.0));
38
+ d2.tasu(1);
39
+ d2.tasu(1);
37
- System.out.println("菓子屋電卓の答とシャーク電卓の答の差は" + shark.tasu(0.0));
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
- 以上にように一度規定した電卓クラスを = new の演算式により名前をつけて操作できるように実体化し、目的通りに操るのがOOPの操作の概略です。
61
+ Dentaku_jissuu<Object> d1 = new Dentaku_jissuu<Object>();
62
+ d1.tasu(5.0);
63
+ d1.tasu(5.0);
42
- 応用として、加減算のみの電卓Dentaku1から乗除算機能を追加したDentaku2オブジェクトを再定義し、インスタンス化して操ったり、メモリー機能を追加して操ったりできます。そこまでできるようになれば、OOPの基礎確立できたことになるでしょう。
64
+ System.out.println("d1" + d1.tasu(0.0));
43
65
 
44
- OOPの考え方を展開すれば、自動車も携帯電話も電子レンジも扇風機も同様です。人間でも企業でもスポーツチームでもオブジェクト指向的に考えると、一般的な通念上の定義と実際的な事物と分けて認識できます。それが、抽象的オブジェクトと具体的なインスタンスとの違いです。
45
- プログラマーは自分で作りたい機能のクラスを設定して、そのクラスに個々の名前をつけて操ります。ゲームのキャラだったり、セキュリティ機能だったり、画面上の個々のウインドウだったりして、みんなオブジェクトを使っています。
46
- 使うだけならば抽象的オブジェクトに関わる必要はありませんが、自分で何らかの機能を設定して、いくつも動かしたり、改良版を開発したりするのなら、抽象的クラスの設定とインスタンス化と継承などを理解する必要があります。
47
- 拙サイトの[オブジェクト指向プログラミングの指導について](http://wp.me/p7SU0v-1P)がオブジェクト指向プログラムについて私なりにまとめたことです。最後方に出てくるウインドウズ版の[オブジェクト指向プログラミング入門キット](http://seastar.la.coocan.jp/download/oop-practice-kit1.lzh)でウインドウオブジェクトを操作してみると、実感できるのではないでしょうか。
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
- 抽象的オブジェクトは設計図であり実体化されたインスタンスはメモリー上に書き込み場所を確保した構築物です。例えば分譲住宅の設計図は図面の上に存在し形になってはいませんが1mmもゆるがせにできない規格です。そして、分譲地に複数棟の住宅が建てた後は、それぞれの住宅は番地も住む人も壁の色もまちまちに使われます。
51
- 考え方と同じく、クラスを=new演で実体化するということは、そクラスが設計した位置と分量プログラムを、メモリー上のインスタンス名で起点を決めた番地から埋め込みメモリーを占有します。変数の番地もメソッドの開始番地も、インスタンス名でのポインタを基準に相対的に確定されます。これあたかも各分譲住宅間取が一緒なのと同様です。
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

説明の訂正

2017/01/09 06:03

投稿

seastar3
seastar3

スコア2287

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

脱字の追加

2017/01/08 08:20

投稿

seastar3
seastar3

スコア2287

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

2

説明の補足

2017/01/08 08:10

投稿

seastar3
seastar3

スコア2287

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)が長年独学でオブジェクト指向プログラムを勉強し分かったことのまとめです。最後の方に出てくるウインドウズ版の[オブジェクト指向プログラミング入門キット](http://seastar.la.coocan.jp/download/oop-practice-kit1.lzh)でウインドウオブジェクトを操作してみると、実感できるのではないでしょうか。
47
+ 拙サイトの[オブジェクト指向プログラミングの指導について](http://wp.me/p7SU0v-1P)がオブジェクト指向プログラムについ私なりにまとめたことです。最後の方に出てくるウインドウズ版の[オブジェクト指向プログラミング入門キット](http://seastar.la.coocan.jp/download/oop-practice-kit1.lzh)でウインドウオブジェクトを操作してみると、実感できるのではないでしょうか。
48
+
49
+ 意外と反響が大きいようで、回答が散らばると混乱しますから、ここに別の観点からの説明も記しておきます。
50
+ 抽象的オブジェクトは設計図であり、実体化されたインスタンスはメモリー上に書き込み場所を確保した構築物です。例えば分譲住宅の設計図は図面の上に存在し形になってはいませんが、1mmもゆるがせにできない規格です。そして、分譲地に複数棟の住宅が建てば、それぞれの住宅は番地も住む人も違って住まれます。
51
+ この考え方と同じく、クラスを=new演算で実体化するということは、メモリー上にインスタンス名で起点を決めたそのクラスが設計した位置と分量のプログラムが埋め込まれます。変数の番地もメソッドの開始番地も相対的に確定されます。これはあたかも各分譲住宅の間取りが一緒なのと同様です。
52
+ 抽象的クラスの役割とインスタンス化ということを、設計図と分譲住宅の例で説明すれば、以上のようになります。

1

表現の訂正

2017/01/08 08:01

投稿

seastar3
seastar3

スコア2287

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)でウインドウオブジェクトを操作してみると、実感できるのではないでしょうか。