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

回答編集履歴

4

微修正

2016/04/06 02:43

投稿

Chironian
Chironian

スコア23274

answer CHANGED
@@ -3,7 +3,7 @@
3
3
  > ・衝突した場合実装も含めて後から読み込んだ内容で必ず上書きする、というルールを加えても駄目なのでしょうか?
4
4
  ・何が問題?
5
5
 
6
- 結局、どうしても残る問題はダイヤモンド継承が引き起こす問題す。
6
+ 結局、ダイヤモンド継承が引き起こす問題が残ってしまうと思います。
7
7
 
8
8
  ###ダイヤモンド継承
9
9
  例えばC#では全てのクラスがobjectクラスを継承しています。ユーザが定義したクラスも暗黙的に継承しています。その御蔭で、objectがToString()を持っているので、どのクラスもToString()を持ってますのでなかなか便利です。

3

微修正

2016/04/06 02:43

投稿

Chironian
Chironian

スコア23274

answer CHANGED
@@ -5,19 +5,19 @@
5
5
 
6
6
  結局、どうしても残る問題はダイヤモンド継承が引き起こす問題です。
7
7
 
8
- #ダイヤモンド継承
8
+ ###ダイヤモンド継承
9
9
  例えばC#では全てのクラスがobjectクラスを継承しています。ユーザが定義したクラスも暗黙的に継承しています。その御蔭で、objectがToString()を持っているので、どのクラスもToString()を持ってますのでなかなか便利です。
10
10
 
11
11
  さて、仮に多重継承できたと仮定し、クラスfooとbarを継承するbazを定義したとします。
12
12
  fooもbarもobjectを継承していますので、bazはobjectをfoo経由とbar経由で継承しています。
13
13
  このような継承図を描くと菱型になるので、ダイヤモンド継承と呼びます。
14
14
 
15
- #ダイヤモンド継承の問題
15
+ ###ダイヤモンド継承の問題
16
16
  そして、objectがstatusというプロパティを持っていたとします。(実際にはないですが。)
17
17
  bazがfooのメソッドhoge()を呼び出した結果statusが変更されたとします。すると、barにとってはあずかり知らないところでstatusが変更されてしまいます。自分の基底クラスのプロパティが自分が知らない内に変わってしまうのです。
18
18
  これはもうパニックです。こんなことまで考慮してプログラムを作れるプログラマは少ないのではないでしょうか?
19
19
 
20
- #多重継承してもダイヤモンド継承にならないようにする?
20
+ ###多重継承してもダイヤモンド継承にならないようにする?
21
21
  > ・多重継承する際、スーパークラスそれぞれに優先順位は付けられないのでしょうか?
22
22
 
23
23
  多重継承した時、ダイアモンド継承にならないよう、fooとbarがそれぞれ別のobjectを持ち、bazが使うobjectはfooとbarの優先順位の高い方(仮にfooとします)にしたと仮定します。

2

追記

2016/04/06 02:38

投稿

Chironian
Chironian

スコア23274

answer CHANGED
@@ -26,4 +26,12 @@
26
26
  実装上のパニックどころか、設計的にパニックになりそうに感じます。
27
27
 
28
28
  実際にそのような言語を作って、使うためのノウハウを積めばもしかすると使えるアイデアなのかも知れないですが、個人的にはパニックが酷くて使えない言語になりそうな予感がします。
29
- といいますか、世の中には頭の良い人が多数いますし、多重継承の問題は多くの人が取り組んでいますので、既に実際に実装し、役に立たないことが確認されているからメジャーになっていないということかも知れません。
29
+ といいますか、世の中には頭の良い人が多数いますし、多重継承の問題は多くの人が取り組んでいますので、既に実際に実装し、役に立たないことが確認されているからメジャーになっていないということかも知れません。
30
+
31
+ ---
32
+ 【追記】
33
+ 継承はis_a関係ですので、fooはobjectの一種であり、barとbazもそうです。
34
+ 従って、bazはobjectの一種として振る舞います。そして、bazはbarの一種としても振る舞います。
35
+ 優先順位を付けた場合、bazはfooのobjectの一種として振る舞うが、barのobjectとしては振る舞わない、でも、barとしては振る舞うことになりますね。
36
+ 「継承」という概念ではない、何か他のパラダイムになりそうです。
37
+

1

微修正

2016/04/06 02:37

投稿

Chironian
Chironian

スコア23274

answer CHANGED
@@ -6,7 +6,7 @@
6
6
  結局、どうしても残る問題はダイヤモンド継承が引き起こす問題です。
7
7
 
8
8
  #ダイヤモンド継承
9
- 例えばC#では全てのクラスがobjectクラスを継承しています。ユーザが定義したクラスも暗黙的に継承しています。その御蔭で、objectがToString()を持っているので、どのクラスからもToString()を呼び出せます。
9
+ 例えばC#では全てのクラスがobjectクラスを継承しています。ユーザが定義したクラスも暗黙的に継承しています。その御蔭で、objectがToString()を持っているので、どのクラスもToString()を持ってますのでなかなか便利です
10
10
 
11
11
  さて、仮に多重継承できたと仮定し、クラスfooとbarを継承するbazを定義したとします。
12
12
  fooもbarもobjectを継承していますので、bazはobjectをfoo経由とbar経由で継承しています。