問題タブ [downcast]
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 - この鋳造動作を修正する最もクリーンな方法
同じタイプであると予想されるノードの特定のサブクラスの50の異なるタイプのリストがあると想像してください。そうでない場合は、ClassExceptionが発生します。このリストを受け取るメソッドと、特定のタイプを保持および実行するノードがあります
私はこのようなことをしたいと思います:
ただし、これは避けてください。
ジェネリックにキャストできない場合は、次のようなことを行うとよいでしょう。
このオプションはすべてnode.addElement(E node)を考慮しているので、Eを期待しています。あらゆる種類のノードを受け入れてキャストするためにこれを変更することを考えました。しかし、それは次のように起こります。なぜList <type>は、コンパイル時と実行時に非型要素を吸収するのでしょうか。
この2番目のアプローチを破棄する必要がありますか?
java - クラスのタイプ E にダウンキャストするにはどうすればよいですか、または少なくとも警告なしで安全な方法で作成するにはどうすればよいですか?
超抽象クラス Node と 50 種類のサブクラス SubNode があります。
プライベート var List<E> を持つジェネリック Class <E extends Node> と、残念ながらスーパークラス Node を常に受け入れなければならないメソッドがあり、E だけに移動することはできません。
タイプ消去のためにオブジェクトを追加する代わりに CastException をスローして、警告なしでコンパイルできるソリューション (Reflection?) はありますか??...
どのタイプのサブクラスに対しても同じ関数を作成する必要はありません。
のような方法があればとてもいいです。
また
java - ダウンキャスト例外
私はこのコードを作りました:
ララは親クラスです。
オエハはララを拡張した子です。
しかし、このコードを実行すると、エラーが発生しました:
java.lang.ClassCastException: $Proxy201
私の間違いがどこにあるのかわかりません。誰かがこの問題を解決するのを手伝ってくれませんか? ありがとうございました。:)
c++ - static_cast のバッファとして *void を使用する
だから私はこれに行きます:
そして、vectC を vecA にキャストしたいと考えています。
そこで、void ポインターをバッファーとキャストとして使用しました。
これは有効ですか?それを行う別の方法はありますか?
c++ - C++ 継承のダウンキャスト
次のような基本クラスがあります。
ポイント オブジェクトからサブポイント オブジェクトにキャストするにはどうすればよいですか? 次の3つすべてを試しました。
これらのキャストの何が問題になっていますか?
c# - C# ではダウンキャストが許可されていないため、これを行うためのより簡単で優れた方法はありますか?」
議論の余地のあるトピックになる可能性がありますが...次のことができないのは本当に嫌いです:
代わりに、次のようなものを使用します。
これははるかに冗長であり、フィールドを User に追加するときはいつでも、それらを UserUI コンストラクターにコピーする必要があります。
ダウンキャストを許可すると、これらすべてがはるかに簡単になり、エラーが発生しにくくなると言っても過言ではありませんか?
java - スーパークラスからのダウンキャスト: リンクされたリスト内のノードから SpecialNode へ
ノードを使用して単一のリンクされたリストを実現しています。ここでは、すべてのノードがその正しい隣人を知っています。ノード n1 -> ノード n2 -> ノード n3 というリストを作成しました。リストを作成すると、Node 型の要素だけが含まれます。ここで、specialLabel を提供するために Node n2 を SpecialNode にする必要があります。ダウンキャスト後、リストは Node n1-> SpecialNode n2-> Node n3 のようになります。これはどのように行うことができますか?
(n2 はその左側の隣人を認識していないことに注意してください。また、リストの作成後に n2 を特別なものにする必要があることに注意してください。そのため、スーパークラスのノードとして初期化した後、どのノードを使用するかを決定する前にいくつかの計算を行う必要があります。特別であること。)
c# - MongoDBBsonDocumentダウンキャスト
C#ドライバーを使用して「FindAndModify」しようとしているコレクションがMongoDBにあります。このコレクションは、次のように、基本クラスとその派生クラスのタイプを保持します。
BsonDocumentを基本クラスにキャストしようとすると、FindAndModifyの後で、結果は「Son」になります。
次の例外が発生します。
System.IO.FileFormatException:要素'SomeProperty'は、Fatherクラスのどのフィールドまたはプロパティとも一致しません。
なぜですか?-ここでダウンキャストできませんか?
ありがとう、ニール。
c# - 基底クラスを派生クラスに変換する
C# で基本クラス オブジェクトをその派生クラスの 1 つに明示的に変換することは可能ですか? 現在、基本クラス オブジェクトをパラメーターとして受け取り、プロパティ値をコピーする派生クラスのコンストラクターを作成する必要があると考えています。私はこの考えがあまり好きではないので、できれば避けたいと思っています。
これは機能するようには見えません (オブジェクトは新しいベースとしてインスタンス化されるため、派生クラスの余分なメンバーにメモリを割り当てる必要はありません) が、C# ではそれを実行できるようです:
c++ - ジオメトリ ライブラリ内のアルゴリズムとデータの分離 (トリプル ディスパッチが必要ですか?)
アプリケーションのジオメトリを扱う部分の設計に問題があります。特に、クラスの階層と交差のための個別のメソッドが必要です。
問題
階層は次のようになります。
- ジオメトリ
- メッシュ
- パラメトリック
- 箱
- 球体
そして、交差メソッドは次のようになります。
これは非常に簡単です。std::vector
問題が発生するのは、すべてのジオメトリを 1 つの構造(または KD ツリーなど) にまとめて格納したい場合です。
そのためには、を使用する必要がありますstd::vector<Geometry*>
。ただし、このベクトルから読み取るとGeometry*
オブジェクトが取得されるため、適切な交差関数を呼び出す方法がありません。
問題の例:
ジオメトリ オブジェクト内にアルゴリズムを実装した場合、問題はビジターと非常に奇妙な関数呼び出しのバウンスによって解決される可能性があります。
ただし、交差アルゴリズムは Geometry クラスの外に置きたいと思います。理由は次のとおりです。
どちらが所有権を持つべきかの決定を避けるため (例えば、ボックスと球の間の交差をどこに実装します
Box
かSphere
?)ジオメトリ オブジェクトが乱雑になるのを避けるために、ジオメトリに対してできることはすべてです。これは非常に多くのことです (ほんの数例を挙げると、ボクセル化、交点の計算、建設的なジオメトリ オペレータの適用など)。したがって、ロジックをデータから分離することは、ここでは非常に望ましいことです。
一方、特定のジオメトリを抽象化できるものがあるため、テンプレートの代わりに階層が必要です... (たとえば、std::vector
、または KD ツリー、または... に格納するため)。
これをどのように解決しますか?これに適したデザインパターンはありますか?私はいくつかのライブラリを見てみましたが、私はすでにそうであったことにもっと混乱しました...
最も簡単な方法 (時々使用される) は、RTTI (またはそれを偽造する) とダウンキャストを使用することですが、それは正確には維持できません... (新しいジオメトリを追加すると、すべてのコードで多くの switch ステートメントを変更する必要があります)。
何かご意見は?
よろしくお願いします。