問題タブ [multiple-inheritance]
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.
c++ - C++ での非対称仮想継承ダイヤモンド
だから私はこの考えを持っています.C ++で実装することは基本的に不可能だと思います...しかし、私は尋ねたい. Stroustrup の第 15 章を読みましたが、答えが得られませんでした。継承ダイヤモンドに関する他の 10 億の質問がこの質問に答えているとは思わないので、ここで質問します。
問題は、共通の基本クラス自体を共有する 2 つの基本クラスから継承するとどうなるかということですが、実質的には 2 つのうちの 1 つだけが継承されます。例えば:
私がこれをやりたいと思う理由は、ライブラリ全体を再コンパイルせずに既存のライブラリを拡張しようとしているからです (ワームの缶を開きたくない)。変更したい継承のチェーンが既に存在します。基本的にはこのようなものです(アスキーアートを許してください)
写真をゲット?各My
クラスのオブジェクトを、それらが本質的に置き換えるクラスのオブジェクトにしたいのですが、継承図の次のクラスでは、My
基本クラスからオーバーライドされたメソッド実装を使用する必要がありますが、他のすべてのメソッドはライブラリのクラス。ライブラリのクラスは事実上継承しないのでこんな感じ
しかし、クラスを事実上継承させると
MyDerived
vtableがあり、vtableがあるため、オブジェクトMyBase
は1つだけですか?LibBase
この質問が十分に明確であることを願っています。
java - Javaでジェネリッククラスパラメータを拡張することは可能ですか?
このようなことは、Java ではまったく意味がありますか?
クラスBがXとCの両方を理想的に拡張することを望みます。しかし、Java には多重継承がないため、よりスマートな回避策を見つけようとしています。
秘訣は、C で定義されるものを代わりにスーパー クラス "A" で定義することです。問題は、「拡張」後にジェネリック型を使用できるようにすることです
考え?
java - Java での多重継承
Java は複数のクラスからの継承を許可していません (それでも、複数のインターフェースからの継承は許可されています)。私はそれが古典的なひし形の問題と非常に一致していることを知っています。しかし、私の質問は、複数の基本クラスから継承する際にあいまいさがない (したがってダイヤモンドの問題の可能性がない) 場合に、Java が C++ のような多重継承を許可しないのはなぜですか?
c++ - 菱形継承問題
私は菱形継承問題を経験していて、さまざまなシナリオでうまくいくと思いました。そして、これは私が取り組んでいたものの1つです。
MainBaseクラスのmainbase変数にアクセスする方法を知りたいですか?任意の入力。
delphi - デルファイで多重継承を実装する方法は?
私は古いライブラリを完全に書き直していますが、この状況をどのように処理するかわかりません(理解するために、すべてが自転車の例えを歓迎します):
私は次のクラスを持っています:
TBike
-バイク自体TBikeWheel
-バイクのホイールの1つTBikeWheelFront
そしてTBikeWheelBack
、両方とも継承しTBikeWheel
、その上に必要な特定のものを実装します
これは非常に簡単ですが、今度は複数の種類の自転車を作成することにしました。各自転車には独自の種類のホイールがあります。通常の前輪/後輪と同じ機能に加えて、その自転車に固有の機能を備えています。
TBikeXYZ
-から継承TBike
TBikeWheelXYZ
-から継承TBikeWheel
そして、ここに私の問題があります: (XYZホイールの特定のメソッドを取得するために)からTBikeWheelFrontXYZ
継承TBikeWheelXYZ
する必要がありますが、(前輪の特定のメソッドを取得するために)からも継承する必要がありTBikeWheelFront
ます。
ここでの私の質問は、それを実装しない方法でどのように実装できるかということです。
- ハックのように感じる
- 同じコードを何度か書き直さなければならない
c# - .NET の多重継承に代わる優れた方法は何ですか?
WPF アプリケーションで、クラス階層に少し問題が発生しました。これは、2 つの継承ツリーがマージされている問題の 1 つであり、多重継承なしでは継承をスムーズに機能させるための論理的な方法を見つけることができません。追跡やデバッグを不可能にすることなく、この種のシステムを機能させるための素晴らしいアイデアを誰かが持っているかどうか疑問に思っています。
私は低レベルのエンジニアなので、最初に考えるのはいつも「ああ、これらのクラスのいくつかをネイティブ C++ で記述して、外部から参照するだけだ!そうすれば、昔ながらの OO のすべてを楽しむことができる!」ということです。残念ながら、管理されたコントロールから継承する必要がある場合、これは役に立ちません...
現在投影されているクラス図のスニペットを表示させてください。
問題は明らかです。CustomizableObject と CustomizableControl のオブジェクト ツリーを分離し、UserControl をツリーの両方ではなく一方に挿入します。
CustomizableObject の実装をその派生クラスに移動することは、実際には意味がありません。実装はクラスによって異なるわけではないからです。さらに、複数回実装すると非常に混乱します。したがって、私は本当に CustomizableObject をインターフェイスにしたくありません。インターフェイス ソリューションは、私には意味がありません。(正直に言うと、インターフェースは私にはあまり意味 がありませんでした...)
もう一度言いますが、誰か素晴らしいアイデアをお持ちですか? これは本物のピクルスです。オブジェクト ツリーに対してではなく、オブジェクト ツリーと共にインターフェイスを機能させる方法について詳しく知りたいです。何よりもしっかりとした練習として、WPF と C# を使用してこの単純なスプライト エンジンを作成しています。これは C++ で簡単に解決できますが、状況が悪化するたびに手を空中に投げて Win32 に戻るのではなく、管理された環境でこれらの問題を解決する方法を理解する必要があります。
c++ - 仮想関数と多重継承の場合のオブジェクト レイアウト
最近のインタビューで、仮想関数と多重継承を伴うオブジェクト レイアウトについて尋ねられました。
多重継承を伴わずに実装する方法 (つまり、コンパイラが仮想テーブルを生成する方法、各オブジェクトに仮想テーブルへの秘密のポインターを挿入する方法など) のコンテキストで説明しました。
私の説明には何かが欠けているように思えました。
ここに質問があります(以下の例を参照)
- クラス C のオブジェクトの正確なメモリ レイアウトを教えてください。
- クラス C の仮想テーブル エントリ。
- クラス A、B、および C のオブジェクトのサイズ (sizeof によって返される) (8、8、16 ??)
- 仮想継承を使用するとどうなりますか。確かに、サイズと仮想テーブルのエントリが影響を受けるはずですか?
コード例:
ありがとう!
python - Python でクラスをデコレートして親オブジェクト タイプを変更する
X と Y の 2 つのクラスがあるとします。クラスに属性を追加してこれらのクラスを修飾し、新しいクラス X1 と Y1 を作成します。
例えば:
new_attributeは、X1 と Y1 の両方で常に同じになります。X と Y は、多重継承が不可能であることを除いて、意味のある方法で関連付けられていません。他にも一連の属性がありますが、これは説明のために縮退しています。
私はこれを複雑にしすぎているように感じますが、デコレータを使用することを考えていました。
かなり一般的なパターンが欠けているように感じます。考え、意見、フィードバックをいただければ幸いです。
読んでくれてありがとう。
ブライアン
編集:例:
これは、明らかになる可能性のある関連する抜粋です。一般的なクラスは次のとおりです。
サブドキュメントは次のとおりです。
Thing には次のプロパティがある場合があります。
その他の場合:
Thing に _AccessParent プロパティがある場合とない場合がある理由を理解できませんでした。
python - 古いスタイルと新しいスタイルの Python クラスをどのように混合しますか?
このトピックに関するいくつかの質問を見てきましたが、決定的な答えを見つけることができませんでした。
新しい Python コード ベースで古いスタイルのクラスを使用する適切な方法を知りたいです。たとえば、AとBという 2 つの固定クラスがあるとします。AとBをサブクラス化し、新しいスタイルのクラス ( A2とB2 ) に変換したい場合、これは機能します。ただし、 A2とB2から新しいクラスCを作成したい場合は問題があります。
したがって、この方法を続行することは可能ですか、それとも基本クラスが古いスタイルとして定義されている場合、すべてのクラスが古いスタイルに準拠する必要がありますか?
明確にするためのコード例を参照してください。
このコードの出力:
ご覧のとおり、問題は への呼び出しでC()
、クラスB2が初期化されていないことです。
更新 - 新しいスタイルのクラスの例
を使用するときの正しい初期化シーケンスがどうあるべきかは明確ではないと思いますsuper
。これは、スーパーへの呼び出しが最初に見つかったものだけでなく、すべての基本クラスを初期化する実際の例です。
そして出力を生成します: