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

回答編集履歴

5

small fix

2015/09/27 01:52

投稿

yohhoy
yohhoy

スコア6191

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

2015/09/27 01:51

投稿

yohhoy
yohhoy

スコア6191

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

2015/09/27 01:49

投稿

yohhoy
yohhoy

スコア6191

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 = new D(); // OK: 暗黙のアップキャスト
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

2015/09/27 01:29

投稿

yohhoy
yohhoy

スコア6191

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

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

2015/09/27 01:28

投稿

yohhoy
yohhoy

スコア6191

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; // アップキャスト → ClassCastException例外
21
+ D y = (D)b2; // ダウンキャスト → ClassCastException例外
22
22
  // yの静的な型D には 動的な型Bを持つインスタンスを保持できない
23
23
  ```