問題タブ [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.

0 投票する
5 に答える
28560 参照

python - Pythonの「スーパー」はどのように正しいことをしますか?

私はPython2.5を実行しているので、この質問はPython 3には当てはまらない可能性があります。多重継承を使用してdiamondクラス階層を作成し、最も派生したクラスのオブジェクトを作成すると、PythonはRight Thing(TM)を実行します。最も派生したクラスのコンストラクターを呼び出し、次に左から右にリストされている親クラス、次に祖父母を呼び出します。私はPythonのMROに精通しています。それは私の質問ではありません。スーパーから返されたオブジェクトが実際に親クラスのスーパーの呼び出しに正しい順序で通信する方法に興味があります。このサンプルコードを考えてみましょう。

コードは直感的なことを行い、次のように出力します。

ただし、Bのinit関数でsuperの呼び出しをコメントアウトすると、AもCのinit関数も呼び出されません。これは、Bのsuperへの呼び出しが、クラス階層全体におけるCの存在を何らかの形で認識していることを意味します。superはオーバーロードされたget演算子でプロキシオブジェクトを返すことを知っていますが、Dのinit定義でsuperによって返されるオブジェクトは、Bのinit定義でsuperによって返されるオブジェクトにCの存在をどのように伝えますか?その後のスーパーユースの呼び出しで得られる情報は、オブジェクト自体に保存されていますか?もしそうなら、なぜスーパーではなくself.superではないのですか?

編集:Jekkeは、superはクラスのインスタンスではなく、クラスの属性であるため、self.superではないことを非常に正しく指摘しました。概念的にはこれは理にかなっていますが、実際にはスーパーもクラスの属性ではありません!これは、BがAから継承する2つのクラスAとBを作成し、を呼び出すことによって、インタープリターでテストできますdir(B)superまたは__super__属性はありません。

0 投票する
6 に答える
30367 参照

c++ - 多重継承 + 仮想関数の混乱

次のようなダイヤモンドの多重継承シナリオがあります。

共通の親である A は、仮想関数 fn() を定義します。
B と C の両方が を定義することは可能fn()ですか?
そうである場合、次の質問は、D が B と C の両方の fn() に明確化せずにアクセスできるかどうかです。これにはいくつかの構文があると思います..
そして、BとCが誰であるかを具体的に知らなくても、Dがそれを行うことは可能ですか? B と C は他のいくつかのクラスに置き換えることができ、D のコードをジェネリックにしたいと考えています。

私がやろうとしているのは、D にその祖先にある fn() のすべてのインスタンスを何らかの方法で列挙させることです。これは、仮想関数という他の手段で可能ですか?

0 投票する
1 に答える
101 参照

vb.net - 派生したSystem.Dataクラス

System.Data名前空間を継承するクラスを利用したいと思います。

具体的には、DataColumn、DataTable、およびDatasetからそれぞれ派生したクラスCarColumn、CarTable、およびCarSetが必要です。

各クラスにプロパティを追加できるようにしたいと思います。例として、これはクラス内のアイテムを参照する方法です。

CarSet.CarTable(0).Columns(0).foo

CarSet.CarTable(0).bar

VB.Netは多重継承に対応していないことを私は知っています。これを達成するための最良の方法は何ですか?

ありがとう、ポール

0 投票する
3 に答える
3000 参照

python - プロジェクトの多重継承と合成の議論 (+その他)

分散センサー群のシミュレーション用の Python プラットフォームを作成しています。これは、エンド ユーザーが SensorNode の動作 (通信、ログ記録など) で構成されるカスタム ノードを作成し、多数の異なるセンサーを実装できるという考え方です。

以下の例は、概念を簡単に示しています。

新しい編集:

まず、私が達成しようとしていることの概要: モバイル センサー ネットワークに特に焦点を当てて、群知能アルゴリズムをシミュレートするシミュレーターを作成しています。これらのネットワークは、環境の複雑な感覚マップを構築するために個々のセンサー データを通信する多数の小型ロボットで構成されています。

このプロジェクトの根底にある目標は、センサーに抽象化されたインターフェイスを提供するシミュレーション プラットフォームを開発して、組み込み Linux を実行するロボット群に同じユーザー実装機能を直接移植できるようにすることです。ロボットの実装が目標であるため、ソフトウェア ノードが同じように動作し、物理ノードが持つ情報にのみアクセスできるように設計する必要があります。

シミュレーション エンジンの一部として、さまざまな種類のセンサーとさまざまな種類のセンサー ノードをモデル化する一連のクラスを提供します。ユーザーがノード上に存在するセンサーと、実装されているセンサーノードのタイプ (モバイル、固定位置) を定義するだけで済むように、この複雑さをすべてユーザーから切り離したいと考えています。

私の最初の考えは、すべてのセンサーが関連する値を返す read() メソッドを提供するだろうということでしたが、質問への応答を読んで、おそらくもっとわかりやすいメソッド名が有益であることがわかりました (.distance(), .position( )、.bearing() など)。

私は当初、より技術的なユーザーが必要に応じて既存のクラスの 1 つを簡単に拡張して新しいセンサーを作成できるように、(共通の祖先を持つ) センサーに個別のクラスを使用したいと考えていました。例えば:

私が最初に多重継承を考えていた理由は (継承の IS-A 関係を半壊させますが)、シミュレーション システムの背後にある基本原理によるものでした。説明させてください:

ユーザーが実装した MySensorNode は、環境内のその位置に直接アクセスできません (ロボットと同様に、アクセスはセンサー インターフェイスを介して間接的に行われます)。同様に、センサーは自分がどこにいるかを認識できません。ただし、センサーの戻り値はすべて環境内の位置と方向に依存するため、この直接的な知識の欠如は問題を引き起こします (正しい値を返すにはシミュレートする必要があります)。

SensorNode は、シミュレーション ライブラリ内に実装されたクラスとして、pygame 環境内で MySensorNode を描画する責任があります。したがって、環境内のセンサー ノードの位置と向きに直接アクセスできる唯一のクラスです。

SensorNode は環境内での並進と回転も担当しますが、この並進と回転はモーター作動の副作用です。

つまり、ロボットはワールド内の位置を直接変更することはできず、モーターに電力を供給することしかできず、ワールド内での動きはモーターと環境との相互作用の副作用であるということです。シミュレーション内でこれを正確にモデル化する必要があります。

したがって、移動するために、ユーザーが実装した機能は次を使用できます。

この呼び出しは、副作用として、ワールド内のノードの位置を変更します。

SensorNode が構成を使用して実装されている場合、SensorNode.motors(...) はインスタンス変数 (位置など) を直接変更することも、MySensorNode.draw() を SensorNode.draw() に解決することもできません。継承を使用して実装されます。

センサーに関しては、このような問題に対する構成の利点は明らかです。MySensorNode は多数のセンサーで構成されています。

ただし、私が見ている問題は、センサーが世界内の位置と向きにアクセスする必要があることです。合成を使用すると、次のような呼び出しになります。

次に、初期化時にセンサーに self を渡すことができると考えてください。

じゃあ後で

ただし、この PosSensor.position() はインスタンスにローカルな情報にアクセスする必要があります ( init () 中に self として渡されます)。では、情報にローカルにアクセスできるのに、なぜ PosSensor を呼び出すのでしょうか? また、カプセル化と情報隠蔽の境界を越えて、構成されているオブジェクトにインスタンスを渡すことは、まったく正しくないようです (Python は情報隠蔽のアイデアをサポートするためにあまり機能しませんが)。

多重継承を使用してソリューションを実装した場合、これらの問題は解消されます。


この編集でいくつかのことが明確になったことを願っています。質問がある場合は、喜んでそれらを明確にしてください

昔の事:

MySensorNode 型のオブジェクトを構築する場合、スーパークラスのすべてのコンストラクターを呼び出す必要があります。各スーパークラスからコンストラクターを呼び出す MySensorNode のカスタム コンストラクターを記述しなければならないことでユーザーを複雑にしたくありません。理想的には、私がしたいことは次のとおりです。

洞察や一般的なコメントをいただければ幸いです、乾杯:)

古い編集:次のようなことをしています:

self は MySensorNode のインスタンスであるため、これは機能します。ただし、このソリューションは面倒です。


0 投票する
6 に答える
496 参照

c# - 異なるサブクラスタイプに割り当てられた共通のプロパティとメソッド

私は独自の基本ユーザーインターフェイスクラスの構築に取り組んでいます。それらについては、すべて同じような「共通の」プロパティとメソッドを持たせたいと思います。インターフェイスクラスを定義することはできますが、インターフェイスは抽象メソッドのみを許可し、プロパティを許可しないようです。

他の点ではまったく同じコードを各クラスにコピーしたくありませんが、実装方法がわかりません...例:この一般的なものをボタン、テキストボックス、チェックボックス、リストボックスなどのユーザーコントロールに適用できるようにします。

提案???

0 投票する
6 に答える
9675 参照

multiple-inheritance - 複数の継承を持つことの長所と短所は何ですか?

多重継承のメリットとデメリットは?

C# で多重継承を使用しないのはなぜですか?

更新 OKなので、どの親メソッドが呼び出されているかなどの衝突を解決する問題のため、現在は回避されています。確かに、これはプログラマーが解決する問題です。または、これは競合がある SQL と同様に解決される可能性があります。つまり、クエリの競合を解決するには、ID を Sales.ID にする必要がある場合があります。

0 投票する
5 に答える
2724 参照

c# - C# でクラス間の共有動作を実装する方法 (もちろん複数の継承なし)

更新:ここにいるほとんどの人が、クラスの設計方法を最初からやり直す必要があると言っています(ちなみに、素晴らしい回答をありがとう!)。ヒントを得て、私は戦略パターンを読み始めました。1 つまたは複数の抽象基本クラスから継承する動作クラス (または戦略クラス) を作成したいと考えています。Type候補クラスは、動作または戦略のように、異なる抽象基本クラス/クラスを持つプロパティを持ちます。多分このようなもの:

コメントや提案はありますか?


元の質問:

私はデザインのパターンと原則を学び、より熟達しようとしています。私は現在、私を困惑させているいくつかのクラスのデザインに取り組んでいます。コードの非常に凝縮されたバージョンを次に示します。

InternalEntryLevelCandidate クラスは主に EntryLevelCandidate ですが、InternalCandidate の実装の一部を共有する必要があります。私が実装と言うのは、実装が異なったり繰り返されたりしたくないからです。それ以外の場合は、共通のコントラクトにインターフェイスを使用し、各クラスに具体的な実装を持ちます。InternalCandidate のプロパティと動作の実装の一部は、共通または共有する必要があります。C++ と Ruby の mixin について読んだことがありますが、これは私がやりたいことに似ているようです。また、単一の「is a」関係を維持しながら、クラスが複数の動作を継承できる動作タイプのアイデアについて説明している興味深いブログ投稿も読みました。http://www.deftflux.net/blog/post/A-good-design-for-multiple-implementation-inheritance.aspx . これは私が望んでいることを伝えているようです。優れた設計手法を使用してこれを達成する方法について、誰かが私に指示を与えることができますか?

0 投票する
0 に答える
454 参照

c# - LinFu-私がやりたいことをする方法がよくわかりません

LinFuを見つけたばかりです-非常に印象的ですが、私がやりたいことを行う方法がよくわかりません-これは、ミックスインによる多重継承です(VB5/6日間で言うように構成/委任-面倒な反復委任コードを生成するためのツール-私がLinFuを見つけたのと同等のC#を探していたとき)。

さらに編集:構成/委任とミックスインの意味を明確にするため。

より多くの「サブクラス」で使用される、より多くのプロパティを持つオブジェクトを想像してみてください。退屈な作業が始まります。コード生成ツールは実際には問題ありません...

したがって、LinFu ....以下のミックスインの例は問題ありませんが、実際のP​​ersonクラス(上記のように)が必要です-LinFu風の方法は何ですか?それとも私は全体のポイントを逃しましたか?

編集:私はすでにサブクラス化されているクラスでこれを行うことができる必要があります。

0 投票する
5 に答える
1658 参照

python - クラスに文字列性を付与するにはどうすればよいですか?

追加の属性を持つ文字列が必要です。たとえば、赤または緑で印刷するかどうかを考えてみましょう。

Subclassing(str) は不変であるため、機能しません。値はわかりますが、煩わしい場合があります。

多重継承は役に立ちますか? 私はそれを使用したことはありません。

オブジェクトのみを継承し、self.value=str を使用すると、すべての文字列性メッセージ (ストリップなど) を自分で実装する必要があります。

または、Ruby の missing_method のように転送する方法はありますか?

インスタンスによってインデックス付けされたクラスレベルの辞書を使用して色を保存するとうまくいくと思います。あまりにも醜いです?

0 投票する
2 に答える
15644 参照

python - 抽象クラス+ミックスイン+Pythonでの多重継承

だから、コードはおそらく私が言葉でできるよりもうまくやろうとしていることを説明していると思うので、ここに行きます:

結果:

抽象/インターフェースクラスの要件を満たすためにミックスインクラスを取得しようとしています。私は何が欠けていますか?