問題タブ [diamond-problem]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
java - 2 つの異なるインターフェイスから同じメソッド名を呼び出す - Java
Java では、ダイヤモンドの問題を保護するために多重継承を許可していません。インターフェイスを使用してこの問題を処理します。
次に、インターフェースを使用する場合、たとえば
run()
classでメソッドを呼び出すとき、C
使用しているインターフェイスをどのように判断できますか?
c++ - ダイヤモンド設計で呼び出す関数を指定しない
私は現在ダイヤモンドのデザインを持っており、関連する質問をここで見ました
その質問では、クラス B とクラス C がクラス A から仮想的に継承されていると仮定します。そのため、クラス D では、仮想関数を呼び出す必要がある場合、どちらを呼び出す必要があるかを指定する必要があります。
私のダイヤモンドの設計では、これらの関数が正しい B または C の親クラス関数によって呼び出されるようにするために、多くの仮想関数を書き直す必要があります。
よくありません。多くの繰り返し作業を行う必要があります。子クラスがある場合、クラス D で B の foo() を呼び出すことができますが、上記の例を書き直すことはできません。
python - Python 多重継承名の衝突
Python での名前の衝突について質問があります。次のようなものがある場合:
D.a
またはからc
取得する方法はありますか?B.a
D
A.a
c++ - C++ 標準:「順序」が定義されているものと定義されていないものがあるのはなぜですか?
- クラスを持つと、そのメンバーの初期化順序はコンストラクターで強く定義されます (この質問のように、メンバー間の依存関係を許可するためかもしれませんが、これは設計上の問題だと思います。循環依存関係を想像できます)。
- 関数呼び出しがあり、パラメーター評価の順序が定義されていません。C 互換性のためだと思います。
そして、次の「恐ろしいダイヤモンド」問題のエラーがあります。
コンパイラは、選択するバージョンを認識していません。順序があいまいであると定義されています。この質問で定義されているように(説得力のない答えで)「左から右の深さ優先解決順序」を使用しない、つまりCよりもBを選択しないのはなぜですか?
では、なぜこれらの異なるアプローチが必要なのでしょうか? 3 ではなく 1 に厳密な順序があるのはなぜですか? 1 を未定義のままにしておく方が簡単ではありませんか? それとも 2 は単純に左から右に定義されていますか?
java - Java多重継承
Java の多重継承の問題を解決する方法を完全に理解するために、明確にする必要がある古典的な質問があります。
私がクラスを持っているとしましょう。Animal
これにはサブクラスがあり、鳥と馬の両方から拡張されたクラスBird
をHorse
作成する必要があります。Pegasus
Bird
Horse
Pegasus
これは古典的なダイヤモンドの問題だと思います。私が理解できることから、これを解決するための古典的な方法は、、Animal
およびBird
クラスHorse
のインターフェースを作成し、Pegasus
それらから実装することです。
鳥や馬のオブジェクトをまだ作成できるという問題を解決する別の方法があるかどうか疑問に思っていました。動物を作成できる方法があれば、それは素晴らしいことですが、必須ではありません。
python - Python2 __bases__ とスーパー
Python 2.7 では、特定のクラスE
からルートへのAN 継承チェーンを再構築しようとしていA
ます。以下に示すようにダイヤモンドの継承の問題がありますが、THE パスではなくパスに興味があるので、うまくいくはずです。自分が(こうして)やるべきことなのかは疑問ですが、今は自分が何を誤解しているのかを知りたいだけです...
出力
Dはそこで何をしているの?呼んでいる
「クラスA」はどこにあるsuper(C, E())
べきですか?最初の行の C が DI だったら (ある程度) 理解できたでしょうが、私の考えでは、2 行目は間違いなく A である必要があります。
何か助けはありますか?
編集:私の理解はその呼び出しでした
C の線形化は であるため、"A" という名前になり[C, A, object]
ます。
しかし、これはsuper(C, obj).name()
明らかに意味するものではありません。それはまだobjの完全な線形化を使用しています: [E, C, D, A, object]
(@Martijn Pietersのおかげで)、それはちょうど(後) Cで始まります.したがって、DはAの前に来ます.