回答編集履歴

5

small fix

2015/09/27 01:52

投稿

yohhoy
yohhoy

スコア6191

test CHANGED
@@ -58,7 +58,7 @@
58
58
 
59
59
 
60
60
 
61
- 継承とは「差分プログラミング」という**考え方を、Java言語において実装する手法であり**、サブクラスのインスタンスは、スーパークラス内に記述されている処理内容とサブクラス内に記述されている処理内容(差分)の両方を持っている。**このような実装によって、サブクラスではスーパークラスの処理内容を繰り返して記述する要がなり必要な差分のみを記述するという差分プログラミングを実現できる**。
61
+ 継承とは「差分プログラミング」という**考え方を、Java言語において実装する手法であり**、サブクラスのインスタンスは、スーパークラス内に記述されている処理内容とサブクラス内に記述されている処理内容(差分)の両方を持っている。**この実装手法によって、サブクラスではスーパークラスの処理内容を繰り返して記述する要がく、処理内容の追加/変更を行いたい差分だけを記述するという差分プログラミングを実現できる**。
62
62
 
63
63
 
64
64
 

4

edit

2015/09/27 01:51

投稿

yohhoy
yohhoy

スコア6191

test CHANGED
@@ -43,3 +43,29 @@
43
43
  // yの静的な型D には 動的な型Bを持つインスタンスを保持できない
44
44
 
45
45
  ```
46
+
47
+
48
+
49
+ ---
50
+
51
+ 他回答コメントに書かれた内容から、該当文脈での"差分"という用語の使われ方を理解できました。
52
+
53
+
54
+
55
+ > 継承は「差分プログラミング」という手法で、サブクラスのインスタンスは、スーパークラス内に記述されている処理内容とサブクラス内に記述されている処理内容(差分)の両方を持っている。
56
+
57
+ 上記の引用文それ自身は、概ね正しいことを言っています。もう少し詳細化するならば次の通りでしょうか。
58
+
59
+
60
+
61
+ 継承とは「差分プログラミング」という**考え方を、Java言語において実装する手法であり**、サブクラスのインスタンスは、スーパークラス内に記述されている処理内容とサブクラス内に記述されている処理内容(差分)の両方を持っている。**このような実装によって、サブクラスではスーパークラスの処理内容を繰り返して記述する要が無くなり、必要な差分のみを記述するという差分プログラミングを実現できる**。
62
+
63
+
64
+
65
+ そして、この話と「ダウンキャストの成功可否」には直接的な関係は**ありません**。ダウンキャスト操作に関係するのは「キャスト先の変数の型は何か?キャスト元のインスタンスの型は何か?」という2点だけです。
66
+
67
+
68
+
69
+ 差分プログラミングはプログラムの設計思想や設計方針について述べたものであり、一方のダウンキャスト操作では単にJava言語仕様を対象とした議論をしています。
70
+
71
+

3

refine

2015/09/27 01:49

投稿

yohhoy
yohhoy

スコア6191

test CHANGED
@@ -12,6 +12,8 @@
12
12
 
13
13
  ```java
14
14
 
15
+ // スーパークラスB を継承した サブクラスD を定義
16
+
15
17
  class B { /*...*/ }
16
18
 
17
19
  class D extends B { /*...*/ }
@@ -22,9 +24,7 @@
22
24
 
23
25
  // d1の静的な型D/動的な型D
24
26
 
25
-
26
-
27
- B b1 = new D(); // OK: 暗黙のアップキャスト
27
+ B b1 = d1; // OK: 暗黙のアップキャスト
28
28
 
29
29
  // b1の静的な型B/動的な型D
30
30
 
@@ -38,7 +38,7 @@
38
38
 
39
39
  // b2の静的な型B/動的な型B
40
40
 
41
- D y = (D)b2; // NG: ダウンキャスト → ClassCastException例外
41
+ D y = (D)b2; // NG: ダウンキャスト → ClassCastException例外が送出される
42
42
 
43
43
  // yの静的な型D には 動的な型Bを持つインスタンスを保持できない
44
44
 

2

refine

2015/09/27 01:29

投稿

yohhoy
yohhoy

スコア6191

test CHANGED
@@ -18,17 +18,17 @@
18
18
 
19
19
 
20
20
 
21
- D d1 = new D();
21
+ D d1 = new D(); // OK
22
22
 
23
23
  // d1の静的な型D/動的な型D
24
24
 
25
25
 
26
26
 
27
- B b1 = new D(); // 暗黙のアップキャスト
27
+ B b1 = new D(); // OK: 暗黙のアップキャスト
28
28
 
29
29
  // b1の静的な型B/動的な型D
30
30
 
31
- D x = (D)b1; // ダウンキャスト
31
+ D x = (D)b1; // OK: ダウンキャスト
32
32
 
33
33
  // xの静的な型D/動的な型D
34
34
 
@@ -38,7 +38,7 @@
38
38
 
39
39
  // b2の静的な型B/動的な型B
40
40
 
41
- D y = (D)b2; // ダウンキャスト → ClassCastException例外
41
+ D y = (D)b2; // NG: ダウンキャスト → ClassCastException例外
42
42
 
43
43
  // yの静的な型D には 動的な型Bを持つインスタンスを保持できない
44
44
 

1

ダウン/アップが逆転していたので修正!!

2015/09/27 01:28

投稿

yohhoy
yohhoy

スコア6191

test CHANGED
@@ -24,11 +24,11 @@
24
24
 
25
25
 
26
26
 
27
- B b1 = new D(); // 暗黙のダウンキャスト
27
+ B b1 = new D(); // 暗黙のアップキャスト
28
28
 
29
29
  // b1の静的な型B/動的な型D
30
30
 
31
- D x = (D)b1; // アップキャスト
31
+ D x = (D)b1; // ダウンキャスト
32
32
 
33
33
  // xの静的な型D/動的な型D
34
34
 
@@ -38,7 +38,7 @@
38
38
 
39
39
  // b2の静的な型B/動的な型B
40
40
 
41
- D y = (D)b2; // アップキャスト → ClassCastException例外
41
+ D y = (D)b2; // ダウンキャスト → ClassCastException例外
42
42
 
43
43
  // yの静的な型D には 動的な型Bを持つインスタンスを保持できない
44
44