問題タブ [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.
c++ - 具体的なサブクラスタイプを知っているときにCスタイルのキャストを使用したダウンキャスト
私のプロジェクトには、さまざまなタイプのQObjectのツリーがあります。私が話していることのアイデアをあなたに与えるべきである簡単な例をあなたに与えましょう。これは、典型的なQObjectツリー(継承図ではありませんが、クラス図にいくらか似ています)である可能性があります。ここでは、ルートオブジェクトを一番上から開始し、その子オブジェクトを下にリストします。
QObjectツリーは必ずしもこのルールに従う必要はありませんが、私の場合、ツリー内の非常にクラスに1つの特定のタイプの親があります。したがって、例として1つの関係にとどまるために、家にはいくつかのフロアと他のタイプの子を含めることができますが、フロアは家の子であり、家だけです。
これらをQObject派生クラスとしてモデル化すると、のインターフェイスは、内部的に何であるかを調べることによってclass Floor
、そのクラスを提供するはずです。私はこの親がタイプになることを本当に知っています。なぜなら、私はそれをそうするように設計し、プログラマーはこの設計に固執するからです。House *house()
QObject::parent()
House*
CスタイルでキャストQObject *parent()
しHouse*
て実装しても大丈夫House *house() const
ですか?
Qtは、を使用することを提案し、から継承しない場合はqobject_cast<House*>(parent())
戻り、キャストをタイプセーフにします。しかし、リリースモードでは、このようなスローキャストは避けたいと思います。qobject_castsの代わりにCスタイルのキャストを実行すると、3倍高速に実行される特定のアルゴリズムのプロファイルを作成しました。これは、qobject_castが実行時にtype-infoについてメタオブジェクトに問い合わせるため、頻繁に呼び出されるとかなりの速度低下が発生するためです。0
QObject* parent()
House
だから私が最終的に得たのは:
これは、デバッグモードでは親が実際にはハウスであると主張しますが、リリースモードでは効率的にCスタイルのキャストを行います。
要点:C ++プログラマーがCスタイルのキャストを行うと、人々は大声で叫ぶでしょうが、この状況では問題ありませんか?
別の解決策は、特定のタイプの親ポインターをメンバー変数として追加で格納することですが、これは冗長であり、ツリーがツリーの親を返すメソッドに反映されることも気に入っています。
java - 強制ダウンキャスト
ダウンキャストが実行できないことはわかっています。しかし、私はそれを回避しようとしています。
これは私が持っているものです。
しかし、私のアプリでは、元の Ticket オブジェクトを強制的に変更したくないので、MyTicket クラスを使用したいと考えています。そのため、Ticket オブジェクトが呼び出し (Web サービス、DB など) から戻ってきたときに、MyTicket にダウンキャストしようとすると、明らかに失敗します。
だから私はこれを回避する方法を見つけようとしていました。「copyAttributes」メソッドを作成するか、MyTicket クラスのコンストラクター内で属性をコピーすることを考えていました。次のようなものです。
クラスの属性を取得して別のクラスに設定する方法はありますか? または、ダウンキャストするまったく別の方法があり、私はそれを見逃していますか?
*解決策: *だから私は以下の解決策を取り、これを思いついた. 転送が行われる前にメイン チケットが見つからない場合に null を返すように変更する必要がありました。
c# - 基本クラス型のすべての派生クラス型に対してキャストを試行せずに、アップキャストされたオブジェクトを再度ダウンキャストできますか?
すべてが同じ基本クラスから派生するオブジェクトのコレクションが与えられる場合があります。コレクションを反復処理して各項目の型を確認すると、オブジェクトが派生型であることがわかり、それに応じて処理できます。私が知りたいのは、既に行っていること以外に、派生型のチェックを実行する簡単な方法があるかどうかです。通常、コードの繰り返しは必要ないため、現在の方法論は少しずれているように思えます。
すべての Web サービスが同じ結果タイプを持つ必要がある Web サービスを使用しています。
目標は、必要なだけ多くの異なる種類のメッセージをクライアントに返すことができるようにすることです。Web サービスの呼び出しごとに 1 つのメッセージを取得する代わりに、呼び出し先は 1 回の旅行ですべての間違い/成功を知ることができ、メッセージから特定の情報を解析する文字列を排除できます。
当初はジェネリックを使用することを考えていましたが、Web サービスはさまざまなメッセージ タイプを持つ可能性があるため、ベース メッセージ クラスを使用するようにコレクションが拡張されました。
c# - VB.NET または C# で基本クラスとして型指定された派生クラス インスタンスを必要とするメソッドを呼び出す
ベースの「オブジェクト」から派生した「宇宙船」と「惑星」の 2 つのオブジェクトがあります。Circle、Triangle、Rectangle など、いくつかのクラスを定義しました。これらはすべて「Shape」クラスから継承されます。
衝突検出の目的で、Obj に「形状」を与えたいと思います。
そのため、「宇宙船」では次のことができます。
「Planet」では次のことができます。
たとえば、異なる形状間の衝突をチェックするメソッド(数回オーバーロード)があります。
と
派生クラスを使用して関数を呼び出すと、これは正常に機能します。たとえば、次のようになります。
しかし、MyShape を使用して呼び出すと、メソッドがオーバーロードを持たない (派生型ではなく) "Shape" をメソッドに渡されているため、エラーが発生します。
次のようなことで解決できました。
しかし、それは面倒なようです。より良い方法はありますか?
c# - ジェネリックにダウンキャストを強制する方法
以下のコードを考えると:
最後のコンパイラ エラー (animalCage から dogCage への変換) を回避するにはどうすればよいですか?
私のコードでは、ケージに dogが含まれていることはわかっていますが、それにキャストする方法を見つけることができません。コンバーターを作成し、 Cage<Animal>の値から新しいCage<Dog>インスタンスを作成するための私のユニークな代替手段はありますか?
.net - 'System.IO.Stream'から'System.IO.MemoryStream'への暗黙のダウンキャスト
問題は次の行にあります。
xmlTextWriter.BaseStreamがタイプストリームであることは知っていますが、どのように型キャストしますか?
高度なサポートに感謝します!
java - ジェネリックからクラスオブジェクトを作成
ジェネリック メソッドでは、実行時にメソッドのジェネリック型にアクセスできないようです (エラー: 型変数から選択できません)。
私がこれを行う理由は、次のようなものを安全にダウンキャストできるようにするためです。
まったく同じ問題を抱えた 9 年以上前の投稿を見つけました: https://forums.oracle.com/forums/thread.jspa?threadID=1184291
そこで、これを解決するためのアイデアは、コンストラクターで Class オブジェクトを提供し、この変数を使用して割り当て可能かどうかを確認することでした。そこに任意のクラスを配置でき、すべての優れた型チェックが役に立たなかったので、これはかなりばかげた解決策のようです...
<any>.class
では、同じ質問:実行時に の型<A>
が完全にわかっているのに、なぜコンストラクターで指定する必要があるのでしょうか? の実際の型にアクセスするにはどうすればよい<A>
ですか?
かなり醜い解決策を見つけました:
を提供する必要がありますClass
が、ここに挿入できる唯一の有効なクラスは戻り値の型です。しかし、少なくとも今はタイプセーフです。
まったく不便です...
java - アップキャストまたは他の方法を使用して、サブクラスからスーパークラスの実装を取得する方法は?
たとえば、サブクラスを使用してスーパークラスの実装を取得する方法を知りたかっただけです。
スーパークラスの実装を取得するためにそれをアップキャストしようとしましたが、役に立ちませんでした
animal1 オブジェクトを使用してスーパークラスの実装を取得するにはどうすればよいですか?
java - ショートのパフォーマンス/メモリの利点は、ダウンキャストによって無効になりますか?
できるだけ多くのメモリを節約し、パフォーマンスを向上させようとしている大規模なアプリケーションを作成しています。そのため、0 ~ 10 または -100 ~ 100 の値しか持たないことがわかっているフィールドがある場合は、short
代わりにデータ型を使用しようとしますint
。
ただし、コードの残りの部分でこれが意味することは、これらの関数を呼び出すときに、単純なint
s をshort
s にダウンキャストする必要があるということです。例えば:
メソッド署名
メソッド呼び出し
int
リテラルはs として扱われ、関数パラメーターに基づいて自動的にダウンキャストまたは型指定されないため、私のコード全体でそのようになっています。
そのため、このダウンキャストが発生すると、パフォーマンスやメモリの向上は実際に重要ですか? それとも、変換プロセスが効率的で、まだいくらかの利益を得ることができますか?
java - オブジェクトのArrayListにアップキャストしてから、カスタムArrayListにダウンキャストするコスト
ArrayList of objects
データベースからデータを取得している状況があり、それをアップキャストしてから、別のカスタムArrayListなどList<User>
にダウンキャストしたいと思います。List<Groups>
私の質問は、オブジェクトにアップキャストしてからArrayListにダウンキャストすることです。コストはどうなりますか。それは効率的ですか、それとも良い習慣ですか。
編集済み
データを取得するのではなく、必要に応じて一度だけList<User>, List<Groups>
データを取得したいので、後でArrayList<objetcs>
データをダウンキャストします。ArrayList<User>,
ArrayList<Groups>