回答編集履歴
5
small fix
answer
CHANGED
@@ -28,7 +28,7 @@
|
|
28
28
|
> 継承は「差分プログラミング」という手法で、サブクラスのインスタンスは、スーパークラス内に記述されている処理内容とサブクラス内に記述されている処理内容(差分)の両方を持っている。
|
29
29
|
上記の引用文それ自身は、概ね正しいことを言っています。もう少し詳細化するならば次の通りでしょうか。
|
30
30
|
|
31
|
-
継承とは「差分プログラミング」という**考え方を、Java言語において実装する手法であり**、サブクラスのインスタンスは、スーパークラス内に記述されている処理内容とサブクラス内に記述されている処理内容(差分)の両方を持っている。**この
|
31
|
+
継承とは「差分プログラミング」という**考え方を、Java言語において実装する手法であり**、サブクラスのインスタンスは、スーパークラス内に記述されている処理内容とサブクラス内に記述されている処理内容(差分)の両方を持っている。**この実装手法によって、サブクラスではスーパークラスの処理内容を繰り返して記述する必要がなく、処理内容の追加/変更を行いたい差分だけを記述するという差分プログラミングを実現できる**。
|
32
32
|
|
33
33
|
そして、この話と「ダウンキャストの成功可否」には直接的な関係は**ありません**。ダウンキャスト操作に関係するのは「キャスト先の変数の型は何か?キャスト元のインスタンスの型は何か?」という2点だけです。
|
34
34
|
|
4
edit
answer
CHANGED
@@ -20,4 +20,16 @@
|
|
20
20
|
// b2の静的な型B/動的な型B
|
21
21
|
D y = (D)b2; // NG: ダウンキャスト → ClassCastException例外が送出される
|
22
22
|
// yの静的な型D には 動的な型Bを持つインスタンスを保持できない
|
23
|
-
```
|
23
|
+
```
|
24
|
+
|
25
|
+
---
|
26
|
+
他回答コメントに書かれた内容から、該当文脈での"差分"という用語の使われ方を理解できました。
|
27
|
+
|
28
|
+
> 継承は「差分プログラミング」という手法で、サブクラスのインスタンスは、スーパークラス内に記述されている処理内容とサブクラス内に記述されている処理内容(差分)の両方を持っている。
|
29
|
+
上記の引用文それ自身は、概ね正しいことを言っています。もう少し詳細化するならば次の通りでしょうか。
|
30
|
+
|
31
|
+
継承とは「差分プログラミング」という**考え方を、Java言語において実装する手法であり**、サブクラスのインスタンスは、スーパークラス内に記述されている処理内容とサブクラス内に記述されている処理内容(差分)の両方を持っている。**このような実装によって、サブクラスではスーパークラスの処理内容を繰り返して記述する要が無くなり、必要な差分のみを記述するという差分プログラミングを実現できる**。
|
32
|
+
|
33
|
+
そして、この話と「ダウンキャストの成功可否」には直接的な関係は**ありません**。ダウンキャスト操作に関係するのは「キャスト先の変数の型は何か?キャスト元のインスタンスの型は何か?」という2点だけです。
|
34
|
+
|
35
|
+
差分プログラミングはプログラムの設計思想や設計方針について述べたものであり、一方のダウンキャスト操作では単にJava言語仕様を対象とした議論をしています。
|
3
refine
answer
CHANGED
@@ -5,19 +5,19 @@
|
|
5
5
|
|
6
6
|
ダウンキャスト/アップキャストの動作を理解する際は、ソースコード上に記述されている「静的な型」と、プログラム実行時に決まるインスタンス自身の「動的な型」を区別して認識すべきです。
|
7
7
|
```java
|
8
|
+
// スーパークラスB を継承した サブクラスD を定義
|
8
9
|
class B { /*...*/ }
|
9
10
|
class D extends B { /*...*/ }
|
10
11
|
|
11
12
|
D d1 = new D(); // OK
|
12
13
|
// d1の静的な型D/動的な型D
|
13
|
-
|
14
|
-
B b1 =
|
14
|
+
B b1 = d1; // OK: 暗黙のアップキャスト
|
15
15
|
// b1の静的な型B/動的な型D
|
16
16
|
D x = (D)b1; // OK: ダウンキャスト
|
17
17
|
// xの静的な型D/動的な型D
|
18
18
|
|
19
19
|
B b2 = new B();
|
20
20
|
// b2の静的な型B/動的な型B
|
21
|
-
D y = (D)b2; // NG: ダウンキャスト → ClassCastException例外
|
21
|
+
D y = (D)b2; // NG: ダウンキャスト → ClassCastException例外が送出される
|
22
22
|
// yの静的な型D には 動的な型Bを持つインスタンスを保持できない
|
23
23
|
```
|
2
refine
answer
CHANGED
@@ -8,16 +8,16 @@
|
|
8
8
|
class B { /*...*/ }
|
9
9
|
class D extends B { /*...*/ }
|
10
10
|
|
11
|
-
D d1 = new D();
|
11
|
+
D d1 = new D(); // OK
|
12
12
|
// d1の静的な型D/動的な型D
|
13
13
|
|
14
|
-
B b1 = new D(); // 暗黙のアップキャスト
|
14
|
+
B b1 = new D(); // OK: 暗黙のアップキャスト
|
15
15
|
// b1の静的な型B/動的な型D
|
16
|
-
D x = (D)b1; // ダウンキャスト
|
16
|
+
D x = (D)b1; // OK: ダウンキャスト
|
17
17
|
// xの静的な型D/動的な型D
|
18
18
|
|
19
19
|
B b2 = new B();
|
20
20
|
// b2の静的な型B/動的な型B
|
21
|
-
D y = (D)b2; // ダウンキャスト → ClassCastException例外
|
21
|
+
D y = (D)b2; // NG: ダウンキャスト → ClassCastException例外
|
22
22
|
// yの静的な型D には 動的な型Bを持つインスタンスを保持できない
|
23
23
|
```
|
1
ダウン/アップが逆転していたので修正!!
answer
CHANGED
@@ -11,13 +11,13 @@
|
|
11
11
|
D d1 = new D();
|
12
12
|
// d1の静的な型D/動的な型D
|
13
13
|
|
14
|
-
B b1 = new D(); // 暗黙の
|
14
|
+
B b1 = new D(); // 暗黙のアップキャスト
|
15
15
|
// b1の静的な型B/動的な型D
|
16
|
-
D x = (D)b1; //
|
16
|
+
D x = (D)b1; // ダウンキャスト
|
17
17
|
// xの静的な型D/動的な型D
|
18
18
|
|
19
19
|
B b2 = new B();
|
20
20
|
// b2の静的な型B/動的な型B
|
21
|
-
D y = (D)b2; //
|
21
|
+
D y = (D)b2; // ダウンキャスト → ClassCastException例外
|
22
22
|
// yの静的な型D には 動的な型Bを持つインスタンスを保持できない
|
23
23
|
```
|