問題タブ [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.
php - PHP5でのダウンキャスト
PHP5にはダウンキャストがないことに気づきました。それを達成するための共通のパターンはありますか?
php - このphpダウンキャストの回避策はどれくらい高価ですか
この質問はphp5のダウンキャストに関連しています
この php ダウンキャストの回避策はどれくらい費用がかかりますか?
この PHP ダウンキャストの回避策は高すぎますか?
私はマイクロタイムズをエコーしましたが、0.001くらいかかるようです。大きなforeachで問題になるのではないかと思います。
http://php.net/manual/en/language.types.type-juggling.phpのコメントで提案されているソリューションも同様です。
.net - vb.netで動的ダウンキャストを行う方法は?
私にはいくつかのクラスがあり、それらはすべてSuperClassから派生しています。
クラスが作成されると、それらはすべてList(Of SuperClass)に入れられます。リストを確認するとき、SuperClassオブジェクトをそのbaseObjectにダウンキャストして、正しいリストに入れたいと思います。(SuperClassのサブタイプごとに1つのリストを作成しました)。
以下を決定することが可能です:
しかし、いくつかのクラスがある場合、これは多くの作業です。
を使用して
サブクラスのタイプを取得します。
私の質問は、これを使用してSuperClassオブジェクトを動的にキャストすることは可能ですか?擬似コード:
編集:サブクラスごとに1つのケースを作成する代わりに変数を使用して、すべてを1つのループで実行できることを望んでいました。
c# - SWIG で生成されたインターフェイスを使用して C# で適切にダウンキャストする方法は?
SWIG を使用して C# インターフェイスを生成しようとしている非常に大規模で成熟した C++ コード ベースがあります。実際の C++ コード自体を変更することはできませんが、SWIG が提供するコードを拡張/更新するために使用することはできます。以下のように記述された C++ 関数が C# で問題を引き起こしているという問題に直面しています。
呼び出し元は次のようなことをするかもしれません:
基本的に、真の型に応じて異なる処理を行う要素のコンテナーを反復処理します。SWIG が生成した "next" 関数用の C# レイヤーは、残念ながら次のことを行います。
そのため、C# の呼び出しコードは、返されたオブジェクトが実際に派生クラスであるかどうかを判断できず、実際には常に基本クラスのように見えます (これは理にかなっています)。私はいくつかの解決策に出くわしました:
- %extend SWIG キーワードを使用してオブジェクトにメソッドを追加し、最終的に dynamic_cast を呼び出します。私が見ているように、このアプローチの欠点は、継承階層を知る必要があることです。私の場合、それはかなり大きく、これはメンテナンスの問題だと思います。
- %factory キーワードを使用してメソッドと派生型を提供し、SWIG に dynamic_cast コードを自動的に生成させます。これは最初のソリューションよりも優れているように見えますが、詳しく見てみると、すべてのメソッドと、それが返す可能性のあるすべての派生型を探し出す必要があります。繰り返しますが、大きなメンテナンスの問題です。このドキュメントのリンクがあればいいのですが、見つかりません。SWIG に付属のサンプル コードを調べて、この機能を知りました。
- 派生オブジェクトのインスタンスを作成し、cPtr を新しいインスタンスに転送する C# メソッドを作成します。これは不器用だと思いますが、うまくいきます。以下の例を参照してください。
これらは本当にオプションですか?そして、既存のすべての関数とクラスの派生を掘り下げる気がない場合は、#3 が残っていますか? どんな助けでも大歓迎です。
c++ - static_cast、dynamic_cast、および reinterpret_cast の誤用を検出する C++ ツールはありますか?
次の質問に対する回答は、C++でのstatic_cast
、dynamic_cast
、およびの推奨される使用法を示しています。reinterpret_cast
static_cast、dynamic_cast、const_cast、および reinterpret_cast はいつ使用する必要がありますか?
この種のキャストの誤用を検出するために使用できるツールを知っていますか? PC-Lint や Coverity Static Analysis などの静的解析ツールはこれを行いますか?
この質問を促した特定のケースはstatic_cast
、ポインターをダウンキャストするための不適切な使用であり、コンパイラーは警告しません。ツールを使用してこのケースを検出したいと思います。開発者がこの間違いを決して犯さないとは思いません。
c++ - これはダウンキャストではありませんか?
私が行った場合
私は「ダウンキャスト」していませんか?
また
この用語は、クラスとオブジェクトの観点からのみ使用されていますか?
double
この場合、大きいものから小さいものに「ダウンキャスト」しているので混乱していますint
が、クラスの場合は、小さいものから大きいものに「ダウンキャスト」していbase class
ますderived class
。
これらの2つの規則は、ある意味で反対ではありませんか?
java - Javaのダウンキャスティングとis-Ahas-Aの関係
こんにちは、
ダウンキャスティングの質問があります。この分野では少し錆びています。私はこのような2つのクラスを持っています:
ユーティリティヘルパークラスに、次のようなメソッドがあります。
ここで、Cは、データベースから削除されてから変換されるオブジェクトです。
問題は、「C」を渡してBを取得することにより、上記のメソッドを呼び出したいということです。そこで、これを試しました。
したがって、上記のメソッドはAIを返しますが、それをBにダウンキャストしようとしましたが、ランタイムClassCastExceptionが発生します。これを回避する方法は本当にありませんか?Bクラス型を返す別のconverts()メソッドを作成する必要がありますか?
クラスBを次のように宣言した場合:
次に、次のように既存のメソッドを呼び出すことができます。
このようにして、extends関係の方が理にかなっている場合でも、既存のメソッドを再利用できます。私は何をすべきか?どんな助けでも大歓迎です。ありがとう。
c# - ダウンキャストによるリストの浅いコピー
私は次のようにクラスの継承を持っています
CEntity---->CNode--->CElement
私は
と
ノード クラスには、異なるプロジェクトに共通する共通項目が含まれます。要素クラスには、プロジェクトに固有の項目があります。
要素リストをノード リストに浅いコピーする必要があります (基本的に、要素をノードにダウン キャストします)。
downcast - float から int へのキャストなど、コンパイラによってキャスト/変換がどのように行われるかを理解しようとしています。
float が int にキャストされるとき、このキャストがコンパイラによってどのように実装されるか。コンパイラは float 変数のメモリの一部をマスクしますか。つまり、残りのメモリを int 変数に渡すために、メモリのどの部分がコンパイラによって取り除かれますか。
これに対する答えは、int と float がメモリ内でどのように維持されるかにあると思います。
しかし、コンパイラ依存ではなくマシン依存ではありませんか。下位の型にキャストされたときに、コンパイラがメモリのどの部分をコピーするかを決定する方法 (これは静的キャストです)。
私は間違った情報に混乱していると思います。
(tag=downcasting に関するいくつかの質問を読みました。そこでは、それがキャストなのか変換なのかについての議論が行われていました。どちらもコンパイラーによって実行されるため、それが何と呼ばれているのかにはあまり興味がありませんが、これがどのように行われているかについては実行されます)。
... ありがとう
c++ - C++継承の質問
私はアプリケーションアーキテクチャに次の問題があり、それを解決したいと思っています(多くのテキストで申し訳ありません)。
私はゲームエンジンのプロトタイプを作成していて、基本抽象クラスを持っていAbstractRenderer
ます(C ++構文を使用しますが、それでも問題は一般的です)。
このレンダラーの派生実装がいくつかあると仮定します。たとえばDirectxRenderer
、とOpenglRenderer
。
さて、これらのレンダラーの1つ(DirectXベースに固執しましょう)だけが、IDirect3D9Device* m_device;
明らかにこの時点ですべてが正常であるというメンバーを持っているとしましょう-m_device
内部で使用DirectxRenderer
され、抽象スーパークラスで公開されるべきではありませんAbstractRenderer
。
たとえば、抽象的なレンダリングインターフェイスも追加しますIRenderable
。それは単に1つの純粋な仮想メソッドを意味しますvirtual void Render(AbstractRenderer* renderer) const = 0;
そして、これはいくつかの問題が始まる場所です。あるシーンをモデリングしていると仮定すると、このシーンにはおそらくいくつかの幾何学的オブジェクトが含まれます。
抽象スーパークラスAbstractGeometricalObject
と派生DirectXベースの実装を作成しますDirectxGeometricalObject
。2つ目は、DirectX固有の頂点およびインデックスバッファーへのポインターを格納する役割を果たします。
今-問題。
AbstractGeometricalObject
論理的にレンダリング可能IRenderable
であるため、明らかにインターフェイスを派生させる必要があります。
私DirectxGeometricalObject
がから派生した場合、最初のものにはメソッドが含まれているAbstractGeometricalObject
はずであり、そのようなものはいくつかの問題を引き起こします。virtual void Render(AbstractRenderer* renderer) const { ... }
Abstract...
より良い説明については、コードを参照してください。
そして今のところ、私のクラスは次のように見えます。
おそらく心配しすぎていることはわかっていますが、このような単純なケースでのこのダウンキャストは、アプリケーションが大きくなると、多くのダウンキャストを強制される可能性があることを意味します。
絶対に避けたいので、デザインの面でもっと良いアドバイスをお願いします/私の間違いを指摘してください。
ありがとうございました