問題タブ [dynamic-dispatch]
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.
oop - 複数の派遣: 概念上の必要性?
複数のディスパッチの概念(つまり、仮想メソッドの動的ディスパッチがメソッドの引数にも拡張されているかのような組み込みサポート) をオブジェクト指向言語に含める必要があるかどうか疑問に思います。無視できる。
問題
次のシナリオを考えてみましょう: 動物の種類を含む (必ずしも平坦ではない) クラス階層があります。コード内のさまざまな場所で、動物オブジェクトに対していくつかのアクションを実行したいと考えています。このオブジェクト参照がどのように取得されるかは気にしませんし、制御することもできません。動物のリストをトラバースすることで遭遇するかもしれませんし、メソッドの引数の 1 つとして与えられるかもしれません。実行したいアクションは、特定の動物のランタイム タイプに応じて特化する必要があります。そのようなアクションの例は次のとおりです。
- GUI で表示するために、動物のビュー モデルを構築します。
- このタイプの動物を表すデータ オブジェクトを作成します (後で DB に格納します)。
- 動物にエサを与えますが、動物の種類に応じて異なる種類のエサを与えます (動物にとってより健康的なもの)。
これらの例はすべて動物オブジェクトのパブリック API で動作しますが、それらが行うことは動物自身のビジネスではないため、動物自体に組み込むことはできません。
ソリューション
1 つの「解決策」は、型チェックを実行することです。しかし、このアプローチはエラーが発生しやすく、リフレクション機能を使用します。これは (私の意見では) ほとんどの場合、設計が悪いことを示しています。型はコンパイル時の概念のみであるべきです。
もう 1 つの解決策は、ビジター パターンを「悪用」(一種) して、二重ディスパッチを模倣することです。しかし、これには、訪問者を受け入れるように動物を変更する必要があります。
他のアプローチがあると確信しています。また、拡張の問題にも対処する必要があります。新しいタイプの動物がパーティーに参加した場合、いくつのコード位置を適応させる必要があり、どうすればそれらを確実に見つけることができますか?
質問
では、これらの要件に照らして、適切に設計されたオブジェクト指向言語に複数ディスパッチを組み込むべきではないでしょうか?
特定のオブジェクトの動的タイプに依存する外部 (内部だけでなく) アクションを作成するのは自然なことではありませんか?
よろしくお願いします!
casting - RcをキャストするにはどうすればよいですかRcに>>
を実装する特性MyTrait
と構造体があります。MyStruct
MyTrait
引数として受け入れる関数もありRc<RefCell<Box<MyTrait>>>
ます。
コードのどこかで、次のインスタンスを作成しますRc<RefCell<Box<MyStruct>>>
。
関数に渡すmy_struct
と、コンパイラ エラーが発生します。
エラー: 型が一致しません: 予想されるalloc::rc::Rc<core::cell::RefCell<Box<MyTrait>>>
、見つかりましたalloc::rc::Rc<core::cell::RefCell<Box<MyStruct>>>
Rc<RefCell<Box<MyStruct>>>
必要な型を明示的に指定してのインスタンスを作成することで、これを修正しようとしています。
この場合、関数への受け渡しは正常に機能しますが、変数を介して特定のフィールドにmy_struct
アクセスできなくなりました。そして、それは にキャストする方法ではないようです。MyStruct
my_struct
Rc<RefCell<Box<MyTrait>>>
Rc<RefCell<Box<MyStruct>>>
どうすればこの問題を回避できますか?
ruby - ネストされたシングルトン クラスのメソッド ルックアップ
まず第一に、この質問は現実世界には当てはまらないことを理解しています。ただ興味があるだけです。
シングルトン メソッドを持つクラスがあるとします。
を呼び出すとFoo.bar
、最初に の各祖先のシングルトン クラスでメソッドが検索され、次にメソッドとその祖先Foo
によって参照されるクラスが検索されます。.class
で確認できFoo.singleton_class.ancestors
ます。これは次を返します。
しかし、次のようなネストされたシングルトン クラスがある場合はどうなるでしょうか。
を呼び出すとFoo.singleton_class.singleton_class.ancestors
、以下が返されます。
この階層がどのように編成されているかわかりません。
c# - C#関数ポリモーフィズムあり
クラス階層に基づくデータ構造にビジター パターンを実装しようとしています。C# では、(まだ) 型をオンにすることはできません。代わりに次のようなことを考えていました。
そして、レイトバウンドディスパッチで呼び出します:
ただし、MyAlgorithm
delegate から継承できないため、これは機能しませんFunc<...>
。
私が見た唯一の解決策は、次のような多くの独自のインターフェースを定義することです。より良い方法はありますか?
c++ - 仮想テンプレートの代替
固定サイズのデータを格納するクラスがあります
現在、データを生成するためのさまざまなアルゴリズムがあります (疑似乱数ジェネレーターなど)。
ここで、これらのジェネレーターのどれを呼び出すかについて、実行時に動的に決定したいと考えています。仮想テンプレートを使用すると (これは不可能です)、次のようになります。
残念ながら、データ クラスの SIZE パラメータを非テンプレート ランタイム パラメータに変更することはできません。さらに、ユーザーがジェネレーター アルゴリズムを選択できるため、実際のジェネレーター インスタンスを実行時に決定する必要があります。可能であれば、タイプセーフなソリューション (boost::any なし) を希望します。
仮想テンプレートが使用できないことはわかっています。これを解決する別の方法はありますか?
prolog - オブジェクト指向プロローグでマルチメソッドを介して恒星オブジェクトを衝突させますか?
Prolog で統合と OO をどのように組み合わせるのだろうか。term オブジェクトにマルチメソッド ディスパッチを実装したいと思います。
用語オブジェクトと単純な用語がなければ、次のようにして、複数引数のインデックス作成から利益を得ることができます。
しかし、上記は正確なタイプの一致のみを提供します。
サブクラス タイプの一致が必要な場合はどうすればよいですか (excelsior、galaxy など、ケース 2、3、および 4 にも一致する必要がある宇宙船のサブクラスがさらに存在する可能性があります)。
統合とインデックス作成は引き続き使用できますか?
さよなら
PS: 例はここからのもので、Prolog ソリューションはありません:
https://en.wikipedia.org/wiki/Multiple_dispatch
c++ - クラス外で宣言されたメソッドの動的ディスパッチ
ライブラリの実装を理解しようとしていますが、一部のメソッドが動的にリンクされている方法に困惑しています。派生クラスのオブジェクトを使用する場合のディスパッチ メカニズムは認識していますが、オブジェクトがないと、それがどのように機能するのかわかりません。私が理解しようとしているライブラリは、gcc のlibitmです。
ヘッダー ファイルlibitm.hは、すべての ABI メソッドをクラスや構造体のないトップレベル メソッドとして宣言します。そして、それらのほとんどについて、私は独自の定義を見つけたので、それらについて質問する必要はなく、ここでは省略します. しかし、次の抜粋は 70 個のメソッドの宣言を示しており、その定義に困惑しています。
ファイルdispatch.hでは、構造体 abi_dispatch が宣言されています。これは、TM アルゴリズムの特定のディスパッチのベースとして使用されます。この構造体では、上記の 70 個のメソッドの宣言が純粋な仮想メソッドとして作成されます。次の抜粋は、メソッドと構造体のマクロ定義を示しています。
abi_dispatch の派生構造体は、たとえばmethod-mlまたはmethod-gl にあります。CREATE_DISPATCH_METHODS(virtual, ) と上記のマクロを使用して、70 の読み取り/書き込みメソッドを生成し、それらをテンプレート関数の読み込み/保存にマップします。
私の大きな疑問は次のとおりです。ランタイム システムは、ライブラリ関数の 1 つが呼び出されたときに、どのメソッド定義 (method-gl または method-ml のもの) を使用する必要があるかをどのように認識しますか? 読み取り/書き込みメソッドの定義では、言及されている abi_dispatch オブジェクトはありません。スレッド ローカル ストレージに abi-dispatch オブジェクトが存在しますが、これがどのように適合するかはわかりません。
助けてくれてありがとう。