回答編集履歴

5

細部の修正

2019/08/31 23:27

投稿

frodo821
frodo821

スコア322

test CHANGED
@@ -96,7 +96,7 @@
96
96
 
97
97
  class Test1 {
98
98
 
99
- void method1() {
99
+ void method() {
100
100
 
101
101
  B b = new B();
102
102
 
@@ -114,9 +114,9 @@
114
114
 
115
115
  ```java
116
116
 
117
- class Test {
117
+ class Test2 {
118
118
 
119
- void method1() {
119
+ void method() {
120
120
 
121
121
  A a = new B();
122
122
 

4

コメントで指摘を受けた点について修正

2019/08/31 23:27

投稿

frodo821
frodo821

スコア322

test CHANGED
@@ -62,12 +62,74 @@
62
62
 
63
63
 
64
64
 
65
- さて、DogクラスはAnimalクラスより正確に犬という存在を表しています。いいかえると、DogクラスはAnimalクラスより犬に特化したクラスとなっています。これが継承の一番重要なポイントでもあるのです。
65
+ さて、DogクラスはAnimalクラスより正確に犬という存在を表しています。いいかえると、DogクラスはAnimalクラスより犬に特化したクラスとなっています。しかし、あるクラスを継承しているのならば、そのクラスを実際に使う側は何も考えずにそのあるクラスと全く同じ使い方ができます。の例で言うならば、「動物全体からその派生である犬に限定したとしても、動物が鳴くし歩くなら、犬も鳴くし歩く」のです。これが継承の一番重要なポイントです。これは要するに、スーパークラスの場所を任意のサブクラスで置き換えたとして正常に動くはずであるということになります。
66
66
 
67
67
 
68
68
 
69
- スーパークラスはサブクラスよりも必ず汎用的なものです。逆に言うと、サブクラスの動作はすべてスーパークラスで想定された動作になっているはずです。つまり、継承するということは、ある領域により特化したクラスを作るということに他なりません。しかし、どれだけ特化したとしても、スーパークラスで定義された動作の範疇であるならば、そのクラスを実際に使う側は何も考えずにスーパークラスと全く同じ使い方ができます。先程の例で言うならば、「動物全体から犬に限定したとしても、動物が鳴くし歩くなら、犬も鳴くし歩く」のです。
69
+ ----
70
+
71
+ 追記
72
+
73
+ javaには隠蔽という仕様があるため、必ずしもそうとは言えない場面も存在します。たとえば、次のAとB二つのクラスに対して、Test1は正しく実行できます。
70
74
 
71
75
 
72
76
 
73
- これこそがオブジェクト指向の考え方の根本といっても過言ではないでしょう。__継承は、スーパークラスの挙動を変更するために行う訳ではありません__。この考えは継承に対する重大な誤解です。むしろ、継承はスーパークラスの挙動をより特化して実装し直すためにするのです。GUIのButtonくらすは黄色くないかもしれません。仮にこれを黄色くするため、Buttonを継承してYellowButtonというクラスを作ったとすると、YellowButtonクラスは「黄色」というより特化した特徴を付け加えるために作ったButtonのサブクラスと考えるべきです。
77
+ ```java
78
+
79
+ class A {
80
+
81
+ public int value = 5;
82
+
83
+ }
84
+
85
+ class B extends A {
86
+
87
+ public String value = "Hoge Hoge";
88
+
89
+ }
90
+
91
+ ```
92
+
93
+
94
+
95
+ ```java
96
+
97
+ class Test1 {
98
+
99
+ void method1() {
100
+
101
+ B b = new B();
102
+
103
+ System.out.println(b.value.endsWith("ge"));
104
+
105
+ }
106
+
107
+ }
108
+
109
+ ```
110
+
111
+
112
+
113
+ 一方、Test2はコンパイルできません。
114
+
115
+ ```java
116
+
117
+ class Test {
118
+
119
+ void method1() {
120
+
121
+ A a = new B();
122
+
123
+ System.out.println(a.value.endsWith("ge"));
124
+
125
+ }
126
+
127
+ }
128
+
129
+ ```
130
+
131
+ というのも、隠蔽の場合は実際の型(変数に格納されたオブジェクトの型)ではなく、見た目の型(変数の型)がアクセスする先に影響するからです。ここがオーバーライドとは大きく違う点です。
132
+
133
+
134
+
135
+ 以上余談でした。

3

コードの修正

2019/08/31 23:19

投稿

frodo821
frodo821

スコア322

test CHANGED
File without changes

2

コードの修正

2019/08/31 22:21

投稿

frodo821
frodo821

スコア322

test CHANGED
@@ -12,7 +12,7 @@
12
12
 
13
13
  public String bark() {
14
14
 
15
- throw UnsupportedOperationException("動物には明確な鳴き声が定義されせん。");
15
+ return "動物鳴きま";
16
16
 
17
17
  }
18
18
 
@@ -42,7 +42,7 @@
42
42
 
43
43
  public String bark() {
44
44
 
45
- return "ワンワン";
45
+ return "犬がワンワンと鳴きます";
46
46
 
47
47
  }
48
48
 

1

文法の修正

2019/08/31 22:21

投稿

frodo821
frodo821

スコア322

test CHANGED
@@ -70,4 +70,4 @@
70
70
 
71
71
 
72
72
 
73
- これこそがオブジェクト指向の考え方の根本といっても過言ではないでしょう。__継承は、スーパークラスの挙動を変更するために行う訳ではありません__。この考えは継承に対する重大な誤解です。むしろ、継承はスーパークラスの挙動をより特化して実装し直すためにするのです。GUIのButtonくらすは黄色くないかもしれません。仮にこれを黄色くするため、YellowButtonというクラスを継承して作ったとすると、YellowButtonクラスは「黄色」というより特化した特徴を付け加えるためにったと考えるべきです。
73
+ これこそがオブジェクト指向の考え方の根本といっても過言ではないでしょう。__継承は、スーパークラスの挙動を変更するために行う訳ではありません__。この考えは継承に対する重大な誤解です。むしろ、継承はスーパークラスの挙動をより特化して実装し直すためにするのです。GUIのButtonくらすは黄色くないかもしれません。仮にこれを黄色くするため、Buttonを継承してYellowButtonというクラスを作ったとすると、YellowButtonクラスは「黄色」というより特化した特徴を付け加えるためにったButtonのサブクラスと考えるべきです。